C 執行時分配記憶體和編譯時分配記憶體的區別

2021-10-01 08:30:43 字數 1908 閱讀 8519

c++記憶體管理詳解:

記憶體分配方式簡介

在c++中,記憶體分成5個區,他們分別是堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。

棧,在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。

堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個new就要對應乙個delete。如果程式設計師沒有釋放掉,那麼在程式結束後,作業系統會自動**。

自由儲存區,就是那些由malloc等分配的記憶體塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。

全域性/靜態儲存區,全域性變數和靜態變數被分配到同一塊記憶體中,在以前的c語言中,全域性變數又分為初始化的和未初始化的,在c++裡面沒有這個區分了,他們共同占用同一塊記憶體區。

常量儲存區,這是一塊比較特殊的儲存區,他們裡面存放的是常量,不允許修改。關鍵字時const

const

int chenxin =10;

//這裡的變數chenxin就是乙個常量,在整個歷程他都不能被修改,

// 可以作為for迴圈的第二個條件判斷的閾值。

乙個由c/c++編譯的程式占用的記憶體分為以下幾個部分

1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。

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

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

4、常量儲存區 —常量字串就是放在這裡的。 程式結束後由系統釋放

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

int a =0;

// 全域性初始化區

char

*p1;

// 全域性未初始化區

const

int b =10;

// 變數將在常量儲存區,程式執行的全程不能修改

char

* p2 =

newchar[9

];// 這個是宣告的乙個動態變數,將存放在動態儲存區,在程式執行時分配記憶體

// get dynamic memory:

intmain()

編譯其實只是乙個掃瞄過程,進行詞法語法檢查,**優化而已,編譯程式越好,程式執行的時候越高效。

我想你說的「編譯時分配記憶體」是指「編譯時賦初值」,它只是形成乙個文字,檢查無錯誤,並沒有分配記憶體空間。類似乙個佔位符的檢查,你在的位置對嗎,這個位置該你佔位嘛。

當你執行時,系統才把程式匯入記憶體。乙個程序(即執行中的程式)在主要包括以下五個分割槽:

棧、堆、bss、data、code

**(編譯後的二進位制**)放在code區,**中生成的各種變數、常量按不同型別分別存放在其它四個區。系統依照**順序執行,然後依照**方案改變或呼叫資料,這就是乙個程式的執行過程。

執行時程式是必須調到「記憶體」的。因為cpu(其中有多個暫存器)只與記憶體打交道的。程式在進入實際記憶體之前要首先分配物理記憶體。

編譯

編譯器能夠識別語法,資料型別等等。然後逐行逐句檢查編譯成二進位制資料的obj檔案,然後再由鏈結程式將其鏈結成乙個exe檔案。此時的程式是以exe檔案的形式存放在磁碟上。

執行

當執行這個exe檔案以後,此程式就被載入到記憶體中,成為程序。此時一開始程式會初始化一些全域性物件,然後找到入口函式(main()或者winmain()),就開始按程式的執行語句開始執行。此時需要的記憶體只能在程式的堆上進行動態增加/釋放了。

程式編譯後執行時的記憶體分配

參考文章之編譯 執行 參考文章之執行程式時的記憶體分配方式 bss段 參考文章之程式執行時的記憶體分配 參考文章之堆 棧 1.程式編譯時的記憶體狀況 編譯時不分配記憶體。編譯器能夠識別語法,資料型別等 然後逐行逐句檢查編譯成資料的.obj檔案 然後再由連線程式將其連線成乙個exe檔案 此時的程式以e...

c 程式執行時的記憶體分配

c 中,記憶體分為5個區 堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。1 棧 是由編譯器在需要時自動分配,不需要時自動清除的變數儲存區。通常存放區域性變數 函式引數等。2 堆 是由new分配的記憶體塊,由程式設計師釋放 編譯器不管 一般乙個new與乙個delete對應,乙個new與乙個del...

程式執行時的記憶體分配

一 在程式執行期間,變數儲存空間有三種 1 靜態儲存區。內存在程式編譯的時候就已經分配好了,這塊內存在程式執行期間都存在,儲存全域性變數和靜態變數。2 棧儲存區。記憶體是在程式執行期間才分配的,函式內區域性變數及函式引數的儲存單元,當 函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理...