C 記憶體區域劃分

2021-09-13 23:32:53 字數 1817 閱讀 3509

c++記憶體區域劃分

1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其

操作方式類似於資料結構中的棧。

2、堆區(heap) — 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os回 收 。

3、全域性區(靜態區)(static)— 全域性變數和靜態變數的儲存是放在一塊的,初始化的 全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另 一塊區域。程式結束後由系統釋放。

4、文字常量區 —常量字串就是放在這裡的。 程式結束後由系統釋放 。(不允許修改)

5、程式**區—存放函式體的二進位制**。

堆和棧的區別

1、管理方式不同;

2、空間大小不同;

3、能否產生碎片不同;

4、生長方向不同;

5、分配方式不同;

6、分配效率不同;

管理方式:對於棧來講,是由編譯器自動管理,無需我們手工控制;對於堆來說,釋放工作由程式設計師控制,容易產生memory leak。

空間大小:一般來講在 32 位系統下,堆記憶體可以達到4g的空間,從這個角度來看堆記憶體幾乎是沒有什麼限制的。但是對於棧來講,一般都是有一定的空間大小的,例如,在vc6下面,預設的棧空間大小是1m(好像是,記不清楚了)。當然,我們可以修改:開啟工程,依次操作選單如下:project->setting->link,在 category 中選中 output,然後在 reserve 中設定堆疊的最大值和 commit。注意:reserve 最小值為 4byte;commit 是保留在虛擬記憶體的頁檔案裡面,它設定的較大會使棧開闢較大的值,可能增加記憶體的開銷和啟動時間。

碎片問題:對於堆來講,頻繁的 new/delete 勢必會造成記憶體空間的不連續,從而造成大量的碎片,使程式效率降低。對於棧來講,則不會存在這個問題,因為棧是先進後出的佇列,他們是如此的一一對應,以至於永遠都不可能有乙個記憶體塊從棧中間彈出,在他彈出之前,在他上面的後進的棧內容已經被彈出,詳細的可以參考資料結構,這裡我們就不再一一討論了。

分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如區域性變數的分配。動態分配由 malloc 函式進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由編譯器進行釋放,無需我們手工實現。

分配效率:棧是機器系統提供的資料結構,計算機會在底層對棧提供支援:分配專門的暫存器存放棧的位址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是 c/c++ 函式庫提供的,它的機制是很複雜的,例如為了分配一塊記憶體,庫函式會按照一定的演算法(具體的演算法可以參考資料結構/作業系統)在堆記憶體中搜尋可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由於記憶體碎片太多),就有可能呼叫系統功能去增加程式資料段的記憶體空間,這樣就有機會分到足夠大小的記憶體,然後進行返回。顯然,堆的效率比棧要低得多。

const變數的儲存位置

對常量的理解還是有誤區,以const int i=10;為例,之前一直誤認為i是儲存在常量儲存區里的,大錯特錯!因為無法解釋const棧變數的儲存位置。實際上並不存在常量儲存區,只有全域性/靜態儲存區。const型別的儲存跟一般的變數沒有區別,在外部定義的儲存在全域性資料區,static的儲存在靜態資料區,在函式內部定義的儲存在棧,const跟非const儲存上沒區別,只不過是read only的。

特例:字串常量會儲存在文字常量區,其內容不允許修改,例如:

int

main()

此處的「123456\0「 儲存在文字常量區,通過p指標去修改的話編譯器(dev c++)不會報錯,但是執行時會出錯。如果在 char *p = 「123456」;前加const關鍵字,編譯器會直接報錯。

c 記憶體區域劃分

c 中,記憶體分為5個區域 堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。其中 棧 就是那些編譯器在需要的時候分配,不需要的時候清理的變數的儲存區域,比如區域性變數和函式引數。在記憶體中連續儲存的區域,位址從低到高。堆 就是new分配的記憶體塊,需要delete。如果沒有delete,在程式退...

C 中記憶體區域的劃分

那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。那些由new或者malloc分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個new就要對應乙個delete。如果程式設計師沒有釋放掉,那麼在程式結束後,作業系統會自動 ...

C和C 記憶體區域的劃分

c記憶體中的儲存區 棧 在執行函式時,函式內 區域性變數 的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。堆 亦稱 動態記憶體分配 程式在 執行的時候用malloc或new申請任意多少的記憶體 程式設計師自...