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