1. 程式人生 > 實用技巧 >c++ 記憶體模型和程式記憶體結構

c++ 記憶體模型和程式記憶體結構

堆:由程式設計師分配釋放。

棧:區域性變數,區域性常量,返回值,引數。

靜態儲存區:全域性靜態變數,區域性靜態變數,全域性常量指標,虛擬函式表。

常量儲存區:全域性常量,函式指標,常量陣列。

程式碼區;

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

2.堆區(heap):一般是由程式設計師分配釋放,若程式設計師不釋放的話,程式結束時可能由OS回收,值得注意的是他與資料結構的堆是兩回事,分配方式倒是類似於資料結構的連結串列。

3.未初始化資料區(BSS):未初始化或初值為0的全域性變數和靜態區域性變數。

4.資料區(data segment

):已初始化且初值非0的全域性變數和靜態區域性變數

5.程式程式碼區:可執行程式碼、字串字面值、只讀變數二進位制程式碼。

??????????????????????????????????????????????????????????????

Text & Data & Bss

  • .text也稱為程式碼段(Code),用來存放程式執行程式碼,同時也可能會包含一些常量(如一些字串常量等)。該段記憶體為靜態分配,只讀(某些架構可能允許修改)。
    這塊記憶體是共享的,當有多個相同程序(Process)存在時,共用同一個text段。
  • .data也有的地方叫GVAR(global value)
    ,用來存放程式中已經初始化的非零全域性變數。靜態分配。
    • data又可分為讀寫(RW)區域和只讀(RO)區域。
      -> RO段儲存常量所以也被稱為.constdata
      -> RW段則是普通非常全域性變數,靜態變數就在其中
  • .bss存放程式中未初始化的和零值全域性變數。靜態分配,在程式開始時通常會被清零。

注意:text和data段都在可執行檔案中,由系統從可執行檔案中載入;而bss段不在可執行檔案中,由系統初始化。

sw-at這張圖中所示記憶體空間,地址由下往上增長,分別標示了 .text.data.bssstackheap的記憶體分部情況。
我們可以看到:

  • text、data(gvar)、bss 在記憶體中地址較低低的位置(low level address),而堆疊則在相對較搞的位置。
  • 堆(Heap)往高地址方向生長,棧(Stack)往低地址方向生長。