堆和栈概念整理
1.內(nèi)存管理方式:
???? 堆:一般由程序員分配釋放,程序員申請時需要指明大小,leg,C語言中malloc函數(shù):p1=(char*)malloc(10),C++中:p2=new char[20].若程序員不去釋放,當(dāng)程序結(jié)束時可能由操作系統(tǒng)釋放 ,注意其與數(shù)據(jù)結(jié)構(gòu)的堆完全是兩回事,分配方式類似于鏈表,分配釋放的關(guān)鍵字:new,malloc,delete,free
???? 棧:由系統(tǒng)自動分配和釋放,存放函數(shù)的參數(shù)值,局部變量等等,操作類似于數(shù)據(jù)結(jié)構(gòu)的棧,eg:生命一個局部變量 int b,系統(tǒng)自動在棧中為其開拓空間
?
2.系統(tǒng)響應(yīng):
???? 堆:OS有一個記錄空閑內(nèi)存地址的鏈表,當(dāng)OS收到程序的申請時,會遍歷該鏈表,尋找第一個空間大于所申請空間的堆結(jié)點,然后將該結(jié)點從空閑結(jié)點鏈表中刪除,并將該結(jié)點的空間分配給程序,另外,對于大多數(shù)系統(tǒng),會在這塊內(nèi)存空間中的首地址處記錄本次分配的大小,這樣代碼中的delete語句才能正確的釋放本內(nèi)存空間。另外由于找到的堆結(jié)點的大小不一定正好等于申請的大小,系統(tǒng)會自動的將多余的那部分重新放入空閑鏈表中。
??? 棧:只要棧的剩余空間大于申請空間,系統(tǒng)將為程序提供內(nèi)存,否則將報異常,提示棧溢出
3.分配效率
??? 堆:是由new分配的內(nèi)存,一般熟讀比較慢,而且容易產(chǎn)生內(nèi)存碎片,不過用起來比較方便。
??? 棧:由系統(tǒng)內(nèi)存自動分配,程序員無法控制,速度較快。
4.存放內(nèi)容:
??? 堆:一般是在堆的頭部用一個字節(jié)存放堆的大小。堆中的具體內(nèi)容有程序員安排
????棧:存放函數(shù)參數(shù)(由右往左入棧),函數(shù)中的局部變量。(多數(shù)C編譯器下)
5.生長方向:
??? 堆:是由低地址向高地址擴展的數(shù)據(jù)結(jié)構(gòu)
??? 棧:由高地址向低地址擴展的數(shù)據(jù)結(jié)構(gòu)。
?6.碎片問題:
?? 堆:頻繁的new/delete勢必會造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低。
?? 棧:則不會存在這個問 題, 因為棧是先進后出的隊列,且存儲空間保持林旭。
?7.空間大小:
?? 堆:一般來講在32位系統(tǒng)下,內(nèi)存可以達(dá)到4G的空間,從這個角度來看堆內(nèi)存幾乎是沒有什么限制的。
? ?棧:一般都是有一定的空間大小的。
詳見:http://baike.baidu.com/view/93201.htm
總結(jié)
                            
                        - 上一篇: 动态更改屏幕方向LANDSCAPE与PO
 - 下一篇: 给IT新人的15个建议:苦逼程序员的辛酸