堆中和棧中申請(qǐng)的空間的比較, 我找到了下面的比較:
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、微信平臺(tái)小程序開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶(hù)創(chuàng)新互聯(lián)還提供了云岡免費(fèi)建站歡迎大家使用!棧的情況:
棧上分配空間的好處是快,而且對(duì)象生存期是自動(dòng)的,離開(kāi)當(dāng)前域之后就自動(dòng)析構(gòu)回收。
壞處就是??臻g有限,而且不能人為控制對(duì)象的生存期,
比如你無(wú)法將一個(gè)函數(shù)內(nèi)部的棧上的對(duì)象返回,因?yàn)檫@個(gè)函數(shù)執(zhí)行完畢后??臻g會(huì)自動(dòng)回收。
堆的情況
堆上分配空間就相反,new一個(gè)空間出來(lái)是較慢的,而且對(duì)堆上對(duì)象的訪(fǎng)問(wèn)也稍慢于棧上。
一旦new一個(gè)空間出來(lái),需要自己手動(dòng)去delete回收,系統(tǒng)不會(huì)幫你管理回收(用GC的除外),
但是分配空間大小靈活,而且正因?yàn)槭鞘謩?dòng)回收的,你可以自由控制對(duì)象生存期,常用來(lái)跨域傳遞對(duì)象。
管理方式不同:棧是由編譯器自動(dòng)管理的。堆的釋放工作是由程序員來(lái)控制的(delete),容易忽略。
空間大小不同:棧,一般都是有一定的空間大小。堆內(nèi)存幾乎是不受限制的。
碎片的產(chǎn)生:堆,頻繁的new/delete勢(shì)必會(huì)造成內(nèi)存空間的不連續(xù),造成大量的碎片空間,程序效率降低。棧,不會(huì)存在這個(gè)問(wèn)題,棧是先進(jìn)后出的隊(duì)列,所以永遠(yuǎn)不可能在內(nèi)存塊中間出現(xiàn)碎片。
分配方式不同:堆是動(dòng)態(tài)分配的,沒(méi)有靜態(tài)分配的堆。棧有兩種分配方式:靜態(tài)和動(dòng)態(tài),靜態(tài)分配時(shí)編譯器自己完成的(局部變量)動(dòng)態(tài)分配是由alloca函數(shù)進(jìn)行分配。
分配效率不同:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會(huì)在底層對(duì)棧提供支持。堆是C++函數(shù)庫(kù)提供的,機(jī)制比較復(fù)雜,所以棧的分配效率比堆的效率高。
堆中的空間是動(dòng)態(tài)申請(qǐng)的 運(yùn)行時(shí)才分配的,棧中的空間是在編譯時(shí),鏈接器進(jìn)行鏈接的時(shí)候就會(huì)確定其地址的,我們申請(qǐng)的局部變量就是棧空間。堆與棧相比劣勢(shì)什么的我覺(jué)得談不上,作用不同,不好評(píng)價(jià)。就比如靜態(tài)數(shù)組和動(dòng)態(tài)數(shù)組,當(dāng)他們用來(lái)存儲(chǔ)輸入的時(shí)候,由于無(wú)法確定輸入數(shù)量,無(wú)疑動(dòng)態(tài)在這里更適合。
從效率上來(lái)說(shuō),村沖在棧中效率是更好的,因?yàn)樵诰幾g時(shí)就會(huì)確定其地址。但是在堆中申請(qǐng)空間則不同,要?jiǎng)討B(tài)的分配地址,有時(shí)還會(huì)要與物理地址建立映射,開(kāi)銷(xiāo)是比棧更大的。