程式的記憶體模型

逆天峰發表於2024-11-09

記憶體分割槽模型

image
C++程式在執行時,將記憶體大致分為4個區域
1.程式碼區:存放函式體的二進位制程式碼,由作業系統進行管理。
2.全域性區:存放全域性變數和靜態變數以及常量。
3.棧區:由編譯器自動分配釋放,存放函式的引數值,區域性變數等。
4.堆區:由程式設計師分配和釋放,若程式設計師不釋放,程式結束時由作業系統回收。
程式碼區沒有什麼問題,就是存放程式碼的地方,而且由作業系統全權管理,和程式設計師沒太大關係。
全域性區,堆區和棧區詢問的問題就比較多了,上次面試面試官就問到這些問題了(沒學過,答的稀爛。。。)。
全域性區,字如其名,存放全域性變數和靜態變數以及常量。全域性變數好理解,靜態變數和常量都有全域性的關係,具體的聯絡和區別在於編譯時,目前還沒有了解到這些知識,先挖個坑。
棧區和堆區則經常用來對比,棧區由編譯器全權負責,管理函式的形參,區域性變數。(都是有自己區域性生存週期,函式形參呼叫函式時自動分配棧區,函式返回後銷燬,區域性變數同理)。堆區則由程式設計師自己管理的區域,防止程式設計師最後忘記回收,若最後有剩餘的作業系統會進行回收操作。
image
四個區存在的意義,方便對不同生命週期的資料進行專門管理,給予了程式設計的靈活性。
image

1.1程式執行前

在程式編譯後,生成一個exe可執行程式,未執行該程式前分為兩個區域。
為什麼只有兩個,因為沒有執行,堆區和棧區都是根據指令(呼叫函式,區域性定義和程式設計師自己申請堆區空間)來實時申請和釋放的,編譯後並沒有這些分割槽。程式碼區不必多說,全域性區則由於編譯時掃描了一遍源程式所以已經能夠分辨全域性變數,靜態變數和常量了。

程式碼區

存放CPU的機器指令。
程式碼區是共享且只讀的,目的是對於頻繁執行的程式,只需要在記憶體中存在一份即可,只讀是防止程式在執行時修改自身。
image

全域性區

全域性區存放的變數有全域性變數、靜態變數和常量(字串常量和全域性常量)。

棧區

存放函式的引數以及區域性變數,編譯器管理和回收。切勿返回區域性變數的地址,因為那塊地址已經釋放,已經沒有許可權了。

堆區

由程式設計師自己管理的區域,程式結束時,作業系統強制回收記憶體。
可以使用new和delete進行操作。用法如下:

new 資料型別(初值)  //整個語句返回開闢的地址
delete 資料型別

舉個例子

int* p = new int(10);
delete p;

陣列比較特殊:

int* p = new int[10];
delepe[] p;

相關文章