棧記憶體與堆記憶體的區別

2021-07-12 06:02:52 字數 854 閱讀 3668

一:程式的記憶體分配

棧區(stack)有編譯器自動分配釋放,存放函式的引數,區域性變數等.

堆區(heap)一般由程式設計師分配和釋放,否則就由os**。堆用於存放全域性變數,靜態變數,常量字串和函式**(函式體的二進位制**).

二:申請後系統的響應

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

堆:在記錄空閒記憶體位址的鍊錶中尋找乙個空間大於所申請空間的堆結點,然後將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式。另外,對於大多數系統會在這塊記憶體空間的首位址出記錄本次分配空間的大小,這樣**中的delete 才能正確釋放本記憶體空間。系統會將多餘的那部分重新空閒鍊錶中。

三:申請大小的限制

棧:在windows中,棧是向低位址擴充套件的資料結構,是一塊連續的記憶體區域。也就是棧頂的位址和棧的最大容量(windows是2m)是系統規定好的。如果申請的空間超過剩餘棧空間,將提示overflow,因此從棧獲得的空間較小。

堆:堆是向高位址擴充套件的資料結構,是不連續的記憶體區域。堆的大小受限於系統中有效的虛擬記憶體。由此可見堆的記憶體獲得比較靈活,空間較大。

四:棧和堆的儲存內容

棧:在棧中,第乙個進棧的是主函式下一條指令的位址,然後是函式的各個引數,在大多數編譯器中,引數是由右往左入棧,然後是函式中的區域性變數。注意,靜態變數不入棧。出棧則剛好順序相反。

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

棧記憶體與堆記憶體的區別

一 程式的記憶體分配 棧區 stack 有編譯器自動分配釋放,存放函式的引數,區域性變數等.堆區 heap 一般由程式設計師分配和釋放,否則就由 os 堆用於存放全域性變數,靜態變數,常量字串和函式 函式體的二進位制 二 申請後系統的響應 棧 只要棧的剩餘空間大於所申請的空間,系統將為程式提供記憶體...

堆記憶體與棧記憶體的區別

一 程式在編譯的時候占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限.2 堆區 heap 亦稱動態記憶體分配.程式在執行的時候用ma...

棧記憶體與堆記憶體的區別

一 程式的記憶體分配 棧區 stack 有編譯器自動分配釋放,存放函式的引數,區域性變數等.堆區 heap 一般由程式設計師分配和釋放,否則就由 os 堆用於存放全域性變數,靜態變數,常量字串和函式 函式體的二進位制 二 申請後系統的響應 棧 只要棧的剩餘空間大於所申請的空間,系統將為程式提供記憶體...