C語言中堆疊的不同
1.管理方式:對於棧來講,是由編譯器自動管理,無需我們手工控制;對於堆 來說,釋放工作由程式設計師控制,容易產生memory leak。
2.空間大小:一般來講在32位系統下,堆記憶體可以達到4G的空間,從這個角 度來看堆記憶體幾乎是沒有什麼限制的。但是對於棧來講,一般都是有一定的空間 大小的,當然,我們可以修改
3.碎片問題:對於堆來講,頻繁的new/delete勢必會造成記憶體空間的不連續, 從而造成大量的碎片,使程式效率降低。對於棧來講,則不會存在這個問題,因 為棧是先進後出的佇列,他們是如此的一一對應,以至於永遠都不可能有一個內 存塊從棧中間彈出,在他彈出之前,在他上面的後進的棧內容已經被彈出
4.生長方向:對於堆來講,生長方向是向上的,也就是向著記憶體地址增加的方 向;對於棧來講,它的生長方向是向下的,是向著記憶體地址減小的方向增長。
5.分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜 態分配和動態分配。靜態分配是編譯器完成的,比如區域性變數的分配。動態分配 由alloca函式進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由 編譯器進行釋放,無需我們手工實現。
6. 分配效率:棧是機器系統提供的資料結構,計算機會在底層對棧提供支援: 分配專門的暫存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧 的效率比較高。堆則是C/C++函式庫提供的,它的機制是很複雜的,例如為了分 配一塊記憶體,庫函式會按照一定的演算法在堆記憶體中搜索可用的足夠大小的空間,如果沒有足夠大小的空間(可能是 由於記憶體碎片太多),就有可能呼叫系統功能去增加程式資料段的記憶體空間,這 樣就有機會分到足夠大小的記憶體,然後進行返回。顯然,堆的效率比棧要低得多。