【c++內存系列】二、c++動態內存分配和靜態內存分配

一、內存的靜態分配與動態分配方式

先簡單理解靜態分配與動態分配:

靜態內存分配和動態內存分配比較典型的例子就是數組和鏈表,數組的長度是預先定義好的,在整個程序中是固定不變的,所以他在內存分配時是以靜態內存分配的方式進行的。而鏈表,它的信息有可能會隨時更改,內存的分配取決於我們實際輸入的數據,這樣就用到了動態內存分配的方式。
靜態內存分配是在程序編譯或者運行過程中,按事先規定的大小分配內存空間的分配方式,他的前提的必須事先知道所需內存空間的大小,動態內存分配是按輸入信息的大小分配所需要的內存單元,他的特點是按需分配。即,靜態內存分配是按計劃分配,由編譯器負責; 動態內存分配是按需分配,由程序員負責。

 

內存的靜態分配和動態分配的區別主要是兩個:

      1. 時間不同。靜態分配發生在程序編譯和連接的時候。動態分配則發生在程序調入和執行的時候。

      2. 空間不同。堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如局部變量的分配。動態分配由函數_alloca進行分配。不過棧的動態分配和堆不同,他的動態分配是由編譯器進行釋放,無需我們手工實現。    

 

二、進程的靜態存儲空間與動態存儲空間

對於一個進程的內存空間而言,可以在邏輯上將存儲空間的分爲三種情況:
程序區:存放程序語句

靜態存儲區:全局變量,局部靜態變量

存放全局變量,在程序開始執行時給全局變量分配存儲區,程序執行完畢就釋放。

動態存儲區:函數形參變量(在調用函數時給形參分配存儲空間),局部動態變量(auto register),函數調用現場保護和返回地址等。

-----------------------------------------------------------------------------------------------------------------

動態存儲方式
所謂動態存儲方式是指在程序運行期間根據需要進行動態的分配存儲空間的方式。
動態存儲變量是在程序執行過程中,使用它時才分配存儲單元, 使用完畢立即釋放。 
典型的例子是函數的形式參數,在函數定義時並不給形參分配存儲單元,只是在函數被調用時,才予以分配,調用函數完畢立即釋放。如果一個函數被多次調用,則反覆地分配、釋放形參變量的存儲單元。

動態存儲區:
1.棧和堆

棧:會存放函數的返回地址、參數和局部變量。

堆:我們通過 new 算符和 malloc 函數分配得到的空間。

堆和棧在內存中分配位置,跟硬件架構和操作系統都有關係。
x86中棧都是由高地址向低地址分配,堆是由低地址向高地址分配,不過在 Windows 和 Linux 中堆和棧的位置相反,另外存放靜態數據、代碼的區域位置也有一些不同。
棧是屬於線程的,每一個線程會有一個自己的棧。
2.局部自動變量
存放在棧區,在棧區裏面其實又可以分成好幾個區域,他們叫做棧楨,一個棧楨就是一個函數,需要調用該函數的時候就如入棧,函數return的時候就會彈出棧,所以他們的生命週期是從函數的開始直到函數結束。
而棧幀裏面又存放着什麼呢,棧幀存放着以下幾種東西:參數變量的地址,局部變量的地址,return的地址(還有棧指針和基指針,想知道這個是就什麼百度吧)
3.自動變量(未加static聲明的局部變量) ;
4.函數調用時的現場保護和返回地址等;
5.動態變量

通常是由malloc new等分配的空間,生命週期是從分配的那一刻直到free結束。
-----------------------------------------------------------------------------------------------------------------


靜態存儲方式
所謂靜態存儲方式是指在程序編譯期間分配固定的存儲空間的方式。
該存儲方式通常是在變量定義時就分定存儲單元並一直保持不變, 

直至整個程序結束。全局變量,靜態變量等就屬於此類存儲方式。  

靜態存儲區:
一定會存在的而且會永恆存在、不會消失,這樣的數據包括常量、常變量(const 變量)、靜態變量、全局變量等。
靜態 、常量、全局變量就是存放在靜態存儲區,他們在程序編譯完成後就已經分配好了,生命週期持續至程序結束。
-----------------------------------------------------------------------------------------------------------------

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章