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的空間,從這個角度來看堆記憶體幾乎是沒有什麼限制的。
棧:一般都是有一定的空間大小的。
詳見:http://baike.baidu.com/view/93201.htm