棧和堆的區別

2021-09-25 12:14:13 字數 739 閱讀 5080

1、空間分配

堆:由程式設計師自己分配和釋放(malloc/free、new/delete),若程式設計師不釋放,程式結束時可能由作業系統**

棧:由系統分配和釋放,存放函式的引數值,區域性變數等

2、系統響應不同

棧:只要剩餘空間大於申請記憶體,系統就會退出,否則會棧溢位。

3、申請大小的限制

棧:在windows下棧是向低位址擴充套件的資料結構,是塊連續的記憶體的區域。 司店的意思是棧頂的位址和線的最大容量是系統預先規定好的↓在wndowsf.我的大小星2m (也有的說星1m,總之星個編譯時就確定的常數) ,如果由請的空間提 t樓的剩餘空間時.將提示overflow.因此,能從棧獲得的空間較小。

堆:堆星向高位址擴充套件的資料結構.是不連續的記憶體區域,這是由於系統是用動表來儲存的空閒記憶體位址的。自然是不連續的,而鍊錶的遍歷方向星由低位址向高位址。堆n  內大小要限於計算機系統中有效的虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大。

4、增長方向不同

棧區空間由高位址向低位址增長

堆區位址由低位址向高位址增長

5、儲存內容

棧:在函式呼叫時,第乙個進棧的是主函式中後的下一條指令(通數呼叫看包的下一條可執行語句)的位址,然後是函式的各個引數在大多數的c編譯器中。引數是想右往左入棧的,然後是函式的區域性變數,注意靜態變數是不入棧的。

堆:一般是在堆的頭部用乙個位元組存放堆的大小,堆中的具體內容由程式設計師安排。

另外,棧的大小在linux系統下可以通過ulimit -s來修改

堆和棧區別

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

堆和棧區別

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

堆和棧區別

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