C++中的堆和棧分別是什么

這篇文章主要講解了“C++中的堆和棧分別是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“C++中的堆和棧分別是什么”吧!

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了定西免費(fèi)建站歡迎大家使用!

C++作為一款C語(yǔ)言的升級(jí)版本,具有非常強(qiáng)大的功能。它不但能夠支持各種程序設(shè)計(jì)風(fēng)格,而且還具有C語(yǔ)言的所有功能。我們?cè)谶@里為大家介紹的是其中一個(gè)比較重要的內(nèi)容,C++內(nèi)存區(qū)域的基本介紹。

C++內(nèi)存區(qū)域分為5個(gè)區(qū)域。分別是堆,棧,自由存儲(chǔ)區(qū),全局/靜態(tài)存儲(chǔ)區(qū)和常量存儲(chǔ)區(qū)。

棧:由編譯器在需要的時(shí)候分配,在不需要的時(shí)候自動(dòng)清除的變量存儲(chǔ)區(qū)。里面通常是局部變量,函數(shù)參數(shù)等。

堆:由new分配的內(nèi)存塊,他們的釋放編譯器不去管,由我們的應(yīng)用程序去控制,一般一個(gè)new對(duì)應(yīng)一個(gè)delete。如果程序員沒(méi)有釋放掉,那么在程序結(jié)束后,操作系統(tǒng)會(huì)自動(dòng)回收。

自由存儲(chǔ)區(qū):由malloc等分配的內(nèi)存塊,和堆十分相似,不過(guò)它使用free來(lái)結(jié)束自己的生命。

全局/靜態(tài)存儲(chǔ)區(qū):全局變量和靜態(tài)變量被分配到同一塊內(nèi)存中,在以前的c語(yǔ)言中。全局變量又分為初始化的和未初始化的,在c++里面沒(méi)有這個(gè)區(qū)分了,他們共同占用同一塊內(nèi)存。

常量存儲(chǔ)區(qū):這是一塊比較特殊的存儲(chǔ)區(qū),里面存放的是常量,不允許修改。

C++內(nèi)存區(qū)域中堆和棧的區(qū)別:

管理方式不同:棧是由編譯器自動(dòng)管理,無(wú)需我們手工控制;對(duì)于堆來(lái)說(shuō),釋放由程序員完成,容易產(chǎn)生內(nèi)存泄漏。

空間大小不同:一般來(lái)講,在32為系統(tǒng)下面,堆內(nèi)存可達(dá)到4G的空間,從這個(gè)角度來(lái)看堆內(nèi)存幾乎是沒(méi)有什么限制的。但是對(duì)于棧來(lái)講,一般都是有一定空間大小的,例如,在vc6下面,默認(rèn)的棧大小好像是1M。當(dāng)然,也可以自己修改:打開工程。 project-->setting-->link,在category中選中output,然后再reserve中設(shè)定堆棧的最大值和 commit。

能否產(chǎn)生碎片:對(duì)于堆來(lái)講,頻繁的new/delete勢(shì)必會(huì)造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低。對(duì)于棧來(lái)講,則不會(huì)存在這個(gè)問(wèn)題。

生長(zhǎng)方向不同:對(duì)于堆來(lái)講,生長(zhǎng)方向是向上的,也就是向著內(nèi)存地址增加的方向;對(duì)于棧來(lái)講,它的生長(zhǎng)方式是向下的,是向著內(nèi)存地址減小的方向增長(zhǎng)。

分配方式不同:堆都是動(dòng)態(tài)分配的;棧有靜態(tài)和動(dòng)態(tài)兩種分配方式。靜態(tài)分配由編譯器完成,比如局部變量的分配。動(dòng)態(tài)分配由alloca函數(shù)進(jìn)行、但棧的動(dòng)態(tài)分配和堆是不同的,它的動(dòng)態(tài)分配由編譯器進(jìn)行釋放,無(wú)需我們手工實(shí)現(xiàn)。

分配效率不同:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會(huì)在底層對(duì)棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比較高。堆則是c/c++庫(kù)函數(shù)提供的,機(jī)制很復(fù)雜。庫(kù)函數(shù)會(huì)按照一定的算法進(jìn)行分配。顯然,堆的效率比棧要低得多。

進(jìn)程內(nèi)存中的映像,主要有代碼區(qū),堆(動(dòng)態(tài)存儲(chǔ)區(qū),new/delete的動(dòng)態(tài)數(shù)據(jù)),棧,靜態(tài)存儲(chǔ)區(qū)

內(nèi)存區(qū)域地址從低到高的方向:代碼區(qū),靜態(tài)存儲(chǔ)區(qū),堆,棧

堆”和“棧”是獨(dú)立的概念平常說(shuō)的“堆?!睂?shí)際上是兩個(gè)概念:“堆”和“棧”。在英文中,堆是heap,棧是stack,不知道什么時(shí)候,什么原因,在中文里,這兩個(gè)不同的概念硬是被搞在一起了,所以,圍繞這個(gè)混合詞所發(fā)生的誤解和爭(zhēng)執(zhí)這幾年就沒(méi)有斷過(guò)。 

“棧”一般是由硬件(CPU)實(shí)現(xiàn)的,CPU用棧來(lái)保存調(diào)用子程序(函數(shù))時(shí)的返回地址,高級(jí)語(yǔ)言有時(shí)也用它作為局部變量的存儲(chǔ)空間。 

“堆”是個(gè)實(shí)實(shí)在在的軟件概念,使用與否完全由編程者“顯示地(explicitly)”決定,如malloc。 

程序經(jīng)過(guò)編譯連接生成執(zhí)行程序后,堆和棧的起始地址就已經(jīng)確定了(具體說(shuō),是通過(guò)“連接程序”),在一個(gè)具有反向增長(zhǎng)的棧的CPU上,數(shù)據(jù)空間可表示如下: 

低    ->|-----------------| 
     ?。∪至浚ㄋ幸殉跏蓟?nbsp;.data,?。?nbsp;
      | 未初始化量 .bss )      ?。?nbsp;
  堆起始->|-----------------| 
      |    堆向高地址增長(zhǎng)     ?。?nbsp;
      |                ?。?nbsp;
     ?。                。?nbsp;
     ?。    ∽杂煽臻g       ?。?nbsp;
      |                ?。?nbsp;
      |                ?。?nbsp;
      |    棧向低地址增長(zhǎng)     ?。?nbsp;
高 棧起始->|-----------------| 

在內(nèi)存中,“堆”和“?!惫灿萌康淖杂煽臻g,只不過(guò)各自的起始地址和增長(zhǎng)方向不同,它們之間并沒(méi)有一個(gè)固定的界限,如果在運(yùn)行時(shí),“堆”和 “?!痹鲩L(zhǎng)到發(fā)生了相互覆蓋時(shí),稱為“棧堆沖突”,系統(tǒng)肯定垮臺(tái)。由于開銷方面的原因,各種編譯在實(shí)現(xiàn)中都沒(méi)有考慮解決這個(gè)問(wèn)題,只有靠設(shè)計(jì)者自己解決,比如增加內(nèi)存等。 

================================================================= 
說(shuō)明(128為例)硬堆棧: 
即SP,通常匯編中講的所謂堆棧(用于PC指針等壓棧),一般設(shè)置從片內(nèi)RAM的頂部0X10FF開始向下生長(zhǎng),基本上64個(gè)足夠足夠了 
軟件堆棧: 
C編譯器自動(dòng)分配的堆棧,在硬堆棧和全局變量之間的空間,也是向下生長(zhǎng),一般用于局部變量。比如一個(gè)子程序定義一個(gè)局部變量A[256],那么此空間即在軟堆棧中,假設(shè)當(dāng)前軟堆棧用到0X800,分派A[256]后,軟堆棧用到0X700,A[0]地址為0X700,A[1]地址為 0X701 ……,當(dāng)然如果局部變量較少,用寄存器就可以了,用不著軟堆棧了。此子程序退出后軟堆?;謴?fù)到0X800。 
另:你的C程序編譯后,生成的匯編文件中,R28:R29就是軟堆棧指針 

感謝各位的閱讀,以上就是“C++中的堆和棧分別是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)C++中的堆和棧分別是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

本文名稱:C++中的堆和棧分別是什么
文章轉(zhuǎn)載:http://muchs.cn/article18/pgddgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、網(wǎng)站導(dǎo)航、營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站建設(shè)做網(wǎng)站、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化