堆」和「棧

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。htm

可否產生碎片:對於堆來說,頻繁的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就是軟堆棧指針 

相關文章
相關標籤/搜索