1.記憶體管理方式:
堆:一般由程式設計師分配釋放,程式設計師申請時需要指明大小,leg,c語言中malloc函式:p1=(char*)malloc(10),c++中:p2=new char[20].若程式設計師不去釋放,當程式結束時可能由作業系統釋放 ,注意其與資料結構的堆完全是兩回事,分配方式類似於鍊錶,分配釋放的關鍵字:new,malloc,delete,free
棧:由系統自動分配和釋放,存放函式的引數值,區域性變數等等,操作類似於資料結構的棧,eg:生命乙個區域性變數 int b,系統自動在棧中為其開拓空間
2.系統響應:
堆:os有乙個記錄空閒記憶體位址的鍊錶,當os收到程式的申請時,會遍歷該鍊錶,尋找第乙個空間大於所申請空間的堆結點,然後將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式,另外,對於大多數系統,會在這塊記憶體空間中的首位址處記錄本次分配的大小,這樣**中的delete語句才能正確的釋放本記憶體空間。另外由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閒鍊錶中。
棧:只要棧的剩餘空間大於申請空間,系統將為程式提供記憶體,否則將報異常,提示棧溢位
3.分配效率
堆:是由new分配的記憶體,一般熟讀比較慢,而且容易產生記憶體碎片,不過用起來比較方便。
棧:由系統記憶體自動分配,程式設計師無法控制,速度較快。
4.存放內容:
堆:一般是在堆的頭部用乙個位元組存放堆的大小。堆中的具體內容有程式設計師安排
棧:存放函式引數(由右往左入棧),函式中的區域性變數。(多數c編譯器下)
5.生長方向:
6.碎片問題:
堆:頻繁的new/delete勢必會造成記憶體空間的不連續,從而造成大量的碎片,使程式效率降低。
棧:則不會存在這個問 題, 因為棧是先進後出的佇列,且儲存空間保持林旭。
7.空間大小:
堆:一般來講在32位系統下,記憶體可以達到4g的空間,從這個角度來看堆記憶體幾乎是沒有什麼限制的。
棧:一般都是有一定的空間大小的。
詳見:
Delphi筆記 整理 堆和棧
在windows 下,乙個程式的堆疊由兩個值定義 堆疊的最小值和最大值。這兩個值受編譯器指示字 minstacksize 和 maxstacksize 所控制,它們的預設值分別是16,384 16k 和1,048,576 1m 在linux 下,堆疊大小只能由環境設定。在register 約定下,最...
堆和棧的區別 概念
一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結...
棧和堆的概念和區別
在程序位址布局 如下圖 可見位址的分布情況,棧和堆所在的位置區域。棧 由編譯器自動分配釋放,存放函式的引數值 區域性變數的值等。其操作方式類似於資料結構中的棧。每當乙個函式被呼叫,該函式返回位址和一些關於呼叫的資訊,比如某些暫存器的內容,被儲存到棧區。然後這個被呼叫的函式再為它的自動變數和臨時變數在...