堆和棧的區別

2021-07-07 09:55:59 字數 1236 閱讀 4935

主要的區別由以下幾點

1、管理方式不同; 

2、空間大小不同; 

3、能否產生碎片不同

4、生長方向不同; 

5、分配方式不同; 

6、分配效率不同; 

管理方式:對於棧來講,是由編譯器自動管理,無需我們手工控制;對於堆來說,釋放

工作由程式設計師控制,容易產生 memory leak。 

空間大小:一般來講在32位系統下,堆記憶體可以達到4g的空間,從這個角度來看堆記憶體

幾乎是沒有什麼限制的。但是對於棧來講,一般都是有一定的空間大小的,例如,在 vc6 下

面,預設的棧空間大小是1m(好像是,記不清楚了)。當然,我們可以修改: 

開啟工程,依次操作選單如下:project ->setting->link,在category  中選中output ,然

後在reserve中設定堆疊的最大值和 commit。 

注意:reserve 最小值為4byte;commit是保留在虛擬記憶體的頁檔案裡面,它設定的較大

會使棧開闢較大的值,可能增加記憶體的開銷和啟動時間。 

碎片問題:對於堆來講,頻繁的 new/delete 勢必會造成記憶體空間的不連續,從而造成大

量的碎片,使程式效率降低。對於棧來講,則不會存在這個問題,因為棧是先進後出的佇列,

他們是如此的一一對應,以至於永遠都不可能有乙個記憶體塊從棧中間彈出,在他彈出之前,

在他上面的後進的棧內容已經被彈出,詳細的可以參考資料結構,這裡我們就不再一一討論

了。 來講,它的生長方向是向下的,是向著記憶體位址減小的方向增長。 

分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態

分配。靜態分配是編譯器完成的,比如區域性變數的分配。動態分配由 alloca 函式進行分配,

但是棧的動態分配和堆是不同的,他的動態分配是由編譯器進行釋放,無需我們手工實現。 

分配效率:棧是機器系統提供的資料結構,計算機會在底層對棧提供支援:分配專門的

暫存器存放棧的位址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是

c/c++ 函式庫提供的,它的機制是很複雜的,例如為了分配一塊記憶體,庫函式會按照一定的

演算法(具體的演算法可以參考資料結構/作業系統)在堆記憶體中搜尋可用的足夠大小的空間,如

果沒有足夠大小的空間(可能是由於記憶體碎片太多),就有可能呼叫系統功能去增加程式資料

段的記憶體空間,這樣就有機會分到足夠大小的記憶體,然後進行返回。顯然,堆的效率比棧要

低得多。 

堆和棧區別

一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其 操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os回 收 注意它...

堆和棧區別

管理方式 棧由編譯器自動管理 堆由程式設計師控制,使用方便,但易產生記憶體洩露。生長方向 棧向低位址擴充套件 即 向下生長 是連續的記憶體區域 堆向高位址擴充套件 即 向上生長 是不連續的記憶體區域。這是由於系統用鍊錶來儲存空閒記憶體位址,自然不連續,而鍊錶從低位址向高位址遍歷。空間大小 棧頂位址和...

堆和棧區別

一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其 操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os回 收 注意它...