c++中在堆和栈中申请空间的差别
堆中和棧中申請的空間的比較, 我找到了下面的比較:
棧的情況:
棧上分配空間的好處是快,而且對象生存期是自動的,離開當前域之后就自動析構回收。
壞處就是棧空間有限,而且不能人為控制對象的生存期,
比如你無法將一個函數(shù)內(nèi)部的棧上的對象返回,因為這個函數(shù)執(zhí)行完畢后棧空間會自動回收。
堆的情況
堆上分配空間就相反,new一個空間出來是較慢的,而且對堆上對象的訪問也稍慢于棧上。
一旦new一個空間出來,需要自己手動去delete回收,系統(tǒng)不會幫你管理回收(用GC的除外),
但是分配空間大小靈活,而且正因為是手動回收的,你可以自由控制對象生存期,常用來跨域傳遞對象。
管理方式不同:棧是由編譯器自動管理的。堆的釋放工作是由程序員來控制的(delete),容易忽略。
空間大小不同:棧,一般都是有一定的空間大小。堆內(nèi)存幾乎是不受限制的。
碎片的產(chǎn)生:堆,頻繁的new/delete勢必會造成內(nèi)存空間的不連續(xù),造成大量的碎片空間,程序效率降低。棧,不會存在這個問題,棧是先進后出的隊列,所以永遠不可能在內(nèi)存塊中間出現(xiàn)碎片。
分配方式不同:堆是動態(tài)分配的,沒有靜態(tài)分配的堆。棧有兩種分配方式:靜態(tài)和動態(tài),靜態(tài)分配時編譯器自己完成的(局部變量)動態(tài)分配是由alloca函數(shù)進行分配。
分配效率不同:棧是機器系統(tǒng)提供的數(shù)據(jù)結構,計算機會在底層對棧提供支持。堆是C++函數(shù)庫提供的,機制比較復雜,所以棧的分配效率比堆的效率高。
堆中的空間是動態(tài)申請的 運行時才分配的,棧中的空間是在編譯時,鏈接器進行鏈接的時候就會確定其地址的,我們申請的局部變量就是棧空間。堆與棧相比劣勢什么的我覺得談不上,作用不同,不好評價。就比如靜態(tài)數(shù)組和動態(tài)數(shù)組,當他們用來存儲輸入的時候,由于無法確定輸入數(shù)量,無疑動態(tài)在這里更適合。
從效率上來說,村沖在棧中效率是更好的,因為在編譯時就會確定其地址。但是在堆中申請空間則不同,要動態(tài)的分配地址,有時還會要與物理地址建立映射,開銷是比棧更大的。
轉載于:https://www.cnblogs.com/hahawgp/archive/2013/04/08/3008737.html
總結
以上是生活随笔為你收集整理的c++中在堆和栈中申请空间的差别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 细学PHP 09 MySql
- 下一篇: 序列化对象C++对象的JSON序列化与反