記憶體中的堆和棧

2021-08-08 20:55:04 字數 1154 閱讀 1087

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

堆和棧的對比

1.記憶體管理方式不同

對於棧來講,是由編譯器自動管理,無需我們手工控制;對於堆來說,釋放工作由程式設計師控制,容易產生記憶體洩漏。

2.生長方向不同

對於堆來講,生長方向是向上的,也就是向著記憶體位址增加的方向;對於棧來講,它的生長方向是向下的,是向著記憶體位址減小的方向增長。

3.申請記憶體響應方式不同

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

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

4.記憶體分配方式不同

堆都是動態分配的,沒有靜態分配的堆。

棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如區域性變數的分配。動態分配由alloca函式進行分配(alloca主要的特徵是,它是在棧上開闢的空間,當它作用域結束時會自動釋放記憶體,不用像malloc那樣,要用free動態釋放空間。還有就是malloc開闢空間成功後,並未對記憶體空間初始化,必須呼叫memset來進行初始化,而alloca則初始化開闢的記憶體空間為0)。

5.分配效率不同

棧是機器系統提供的資料結構,計算機會在底層對棧提供支援:分配專門的暫存器存放棧的位址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比 較高。

堆則是c/c++函式庫提供的,它的機制是很複雜的,例如為了分配一塊記憶體,庫函式會按照一定的演算法(具體的演算法可以參考資料結構/作業系統)在堆 記憶體中搜尋可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由於記憶體碎片太多),就有可能呼叫系統功能去增加程式資料段的記憶體空間,這樣就有機會分 到足夠大小的記憶體,然後進行返回。顯然,堆的效率比棧要低得多。

記憶體中堆和棧

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

記憶體中的堆和棧

堆區,棧區,全域性區,文字常量區,程式 區 棧是你的電腦記憶體的乙個特別區域,它用來儲存被每乙個function 包括mian 方法 建立的臨時變數。棧是filo,就是先進後出原則的結構體,它密切的被cpu管理和充分利用。每次function宣告乙個新的變數,它就會被 推 到棧中。然後每次乙個fun...

記憶體中的堆和棧

一般情況下程式存放在rom或flash中,執行時需要拷到記憶體中執行,記憶體會分別儲存不同的資訊。1 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 作...