亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-06-29 09:49:22 來源:億速云 閱讀:374 作者:chen 欄目:大數據

這篇文章主要講解了“C++中的堆和棧分別是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++中的堆和棧分別是什么”吧!

C++作為一款C語言的升級版本,具有非常強大的功能。它不但能夠支持各種程序設計風格,而且還具有C語言的所有功能。我們在這里為大家介紹的是其中一個比較重要的內容,C++內存區域的基本介紹。

C++內存區域分為5個區域。分別是堆,棧,自由存儲區,全局/靜態存儲區和常量存儲區。

棧:由編譯器在需要的時候分配,在不需要的時候自動清除的變量存儲區。里面通常是局部變量,函數參數等。

堆:由new分配的內存塊,他們的釋放編譯器不去管,由我們的應用程序去控制,一般一個new對應一個delete。如果程序員沒有釋放掉,那么在程序結束后,操作系統會自動回收。

自由存儲區:由malloc等分配的內存塊,和堆十分相似,不過它使用free來結束自己的生命。

全局/靜態存儲區:全局變量和靜態變量被分配到同一塊內存中,在以前的c語言中。全局變量又分為初始化的和未初始化的,在c++里面沒有這個區分了,他們共同占用同一塊內存。

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

C++內存區域中堆和棧的區別:

管理方式不同:棧是由編譯器自動管理,無需我們手工控制;對于堆來說,釋放由程序員完成,容易產生內存泄漏。

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

能否產生碎片:對于堆來講,頻繁的new/delete勢必會造成內存空間的不連續,從而造成大量的碎片,使程序效率降低。對于棧來講,則不會存在這個問題。

生長方向不同:對于堆來講,生長方向是向上的,也就是向著內存地址增加的方向;對于棧來講,它的生長方式是向下的,是向著內存地址減小的方向增長。

分配方式不同:堆都是動態分配的;棧有靜態和動態兩種分配方式。靜態分配由編譯器完成,比如局部變量的分配。動態分配由alloca函數進行、但棧的動態分配和堆是不同的,它的動態分配由編譯器進行釋放,無需我們手工實現。

分配效率不同:棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是c/c++庫函數提供的,機制很復雜。庫函數會按照一定的算法進行分配。顯然,堆的效率比棧要低得多。

進程內存中的映像,主要有代碼區,堆(動態存儲區,new/delete的動態數據),棧,靜態存儲區

內存區域地址從低到高的方向:代碼區,靜態存儲區,堆,棧

堆”和“棧”是獨立的概念平常說的“堆棧”實際上是兩個概念:“堆”和“棧”。在英文中,堆是heap,棧是stack,不知道什么時候,什么原因,在中文里,這兩個不同的概念硬是被搞在一起了,所以,圍繞這個混合詞所發生的誤解和爭執這幾年就沒有斷過。 

“棧”一般是由硬件(CPU)實現的,CPU用棧來保存調用子程序(函數)時的返回地址,高級語言有時也用它作為局部變量的存儲空間。 

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

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

低    ->|-----------------| 
      | 全局量(所有已初始化量 .data, | 
      | 未初始化量 .bss )       | 
  堆起始->|-----------------| 
      |    堆向高地址增長      | 
      |                 | 
      |                 | 
      |     自由空間        | 
      |                 | 
      |                 | 
      |    棧向低地址增長      | 
高 棧起始->|-----------------| 

在內存中,“堆”和“棧”共用全部的自由空間,只不過各自的起始地址和增長方向不同,它們之間并沒有一個固定的界限,如果在運行時,“堆”和 “棧”增長到發生了相互覆蓋時,稱為“棧堆沖突”,系統肯定垮臺。由于開銷方面的原因,各種編譯在實現中都沒有考慮解決這個問題,只有靠設計者自己解決,比如增加內存等。 

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

感謝各位的閱讀,以上就是“C++中的堆和棧分別是什么”的內容了,經過本文的學習后,相信大家對C++中的堆和棧分別是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

连江县| 陵川县| 尼玛县| 屯留县| 阿克| 孝感市| 四会市| 通榆县| 泰兴市| 屏山县| 平和县| 曲水县| 新安县| 阳朔县| 广宗县| 财经| 鄂伦春自治旗| 大渡口区| 连江县| 岐山县| 平安县| 永昌县| 淮安市| 普陀区| 杭州市| 葫芦岛市| 新平| 贡觉县| 田阳县| 同江市| 肃南| 分宜县| 正蓝旗| 宁强县| 渝中区| 福鼎市| 门头沟区| 开平市| 呼伦贝尔市| 光泽县| 自贡市|