c++ 記憶體模型和程式記憶體結構
阿新 • • 發佈:2020-10-13
堆:由程式設計師分配釋放。
棧:區域性變數,區域性常量,返回值,引數。
靜態儲存區:全域性靜態變數,區域性靜態變數,全域性常量指標,虛擬函式表。
常量儲存區:全域性常量,函式指標,常量陣列。
程式碼區;
1.棧區(stack):又編譯器自動分配釋放,存放函式的引數值,區域性變數的值等,其操作方式類似於資料結構的棧。
2.堆區(heap):一般是由程式設計師分配釋放,若程式設計師不釋放的話,程式結束時可能由OS回收,值得注意的是他與資料結構的堆是兩回事,分配方式倒是類似於資料結構的連結串列。
3.未初始化資料區(BSS):未初始化或初值為0的全域性變數和靜態區域性變數。
4.資料區(data segment
5.程式程式碼區:可執行程式碼、字串字面值、只讀變數二進位制程式碼。
??????????????????????????????????????????????????????????????
Text & Data & Bss
- .text:也稱為程式碼段(Code),用來存放程式執行程式碼,同時也可能會包含一些常量(如一些字串常量等)。該段記憶體為靜態分配,只讀(某些架構可能允許修改)。
這塊記憶體是共享的,當有多個相同程序(Process)存在時,共用同一個text段。 - .data:也有的地方叫GVAR(global value)
- data又可分為讀寫(RW)區域和只讀(RO)區域。
-> RO段儲存常量所以也被稱為.constdata
-> RW段則是普通非常全域性變數,靜態變數就在其中
- data又可分為讀寫(RW)區域和只讀(RO)區域。
- .bss:存放程式中未初始化的和零值全域性變數。靜態分配,在程式開始時通常會被清零。
注意:text和data段都在可執行檔案中,由系統從可執行檔案中載入;而bss段不在可執行檔案中,由系統初始化。
在sw-at這張圖中所示記憶體空間,地址由下往上增長,分別標示了 .text、.data、.bss、stack和heap的記憶體分部情況。
我們可以看到:
- text、data(gvar)、bss 在記憶體中地址較低低的位置(low level address),而堆疊則在相對較搞的位置。
- 堆(Heap)往高地址方向生長,棧(Stack)往低地址方向生長。