棧區和堆區

2022-03-27 02:05:40 字數 1287 閱讀 6153

注意,這裡所說的堆區和棧區指的是(虛擬)記憶體區域,跟資料結構中的堆疊不一樣。

棧區(stack)—— 由編譯器自動分配釋放,存放區域性變數的值、

函式呼叫所需要維護的資訊等。 棧區必須滿足這樣一條規則:先入棧的資料後出棧(first in last out, filo)。

堆區(heap)——一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由作業系統**。在c/c++中,堆區一般是通過malloc/new來申請的。

兩者相同的一點就是它們都是分配在作業系統的虛擬記憶體中。

棧區是由編譯器自動分配釋放。

堆區一般是由程式設計師分配和釋放。若程式設計師不釋放,程式結束時可能由作業系統**。

棧區總是向低位址增長。 壓棧的操作使棧頂的位址減小,彈出的操作使棧頂位址增大。

堆區總是向高位址增長。

棧區是一段連續的記憶體區域,其大小是作業系統預先規定好的(如下windows下可能是2m)。當申請的空間超過棧的剩餘空間時,將會導致棧溢位,最終導致程式終止。因此,能從棧區獲得的空間較小。

堆區不一定是連續的記憶體區域(因為作業系統是用鍊錶來儲存空閒記憶體位址的)

,其大小受限於作業系統中有效的虛擬記憶體。因此,能從棧區獲得的空間比較靈活,也比較大。

棧區:只要棧的剩餘空間大於所申請空間,作業系統將為程式提供記憶體,否則將報異常提示棧溢位。

堆區:作業系統有乙個記錄空閒記憶體位址的鍊錶。當系統收到程式的申請時,會遍歷該鍊錶,尋找第乙個空間大於所申請空間的堆結點,然後將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式。而且,對於大多數系統,會在這塊記憶體空間中的首位址處記錄本次分配的大小。這樣,**中的free/delete語句才能正確的釋放已申請的記憶體空間。另外,由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閒鍊錶中。

棧區由作業系統自動分配,速度較快。但程式設計師是無法控制的。

堆區是由malloc/new分配的記憶體,一般速度比較慢,而且容易產生記憶體碎片,不過用起來方便。

棧區剩餘空間不足時,會導致棧溢位。

堆區的頻繁申請和釋放容易導致記憶體碎片。

棧區和堆區的區別可以用如下的形象比喻來看出:    

使用棧就像我們去飯館裡吃飯,只管點菜(發出申請)、付錢和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,它的好處是快捷,但是自由度小。使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。

堆和棧的區別**過無數次的文章)

what』s the difference between a stack and a heap?

堆區和棧區

1 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由系統 3 全域性區 靜態區static 全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變...

堆區和棧區

棧區 由編譯器自動分配並釋放 存放函式的引數值 區域性變數等 棧空間分靜態分配和動態分配 靜態分配是編譯器完成的比如自動變數 auto 的分配,棧的動態分配無需釋放,也就沒有釋放函式 堆區 由程式設計師分配和釋放,如果程式設計師不釋放,程式結束時,可能會由作業系統 比如ios中的alloc都是存放堆...

靜態儲存區 堆區和棧區

記憶體分配有三種 靜態儲存區 堆區和棧區。他們的功能不同,對他們使用方式也就不同。靜態儲存區 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資料 全域性資料和常量。棧區 在執行函式時,函式 包括main函式 內區域性變數的儲存單元都可以在棧上建立,函式執行結束時...