堆和栈概念整理
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
總結
- 上一篇: 动态更改屏幕方向LANDSCAPE与PO
- 下一篇: 给IT新人的15个建议:苦逼程序员的辛酸