天天看點

C/C++程式的記憶體布局---來自unix環境進階程式設計

C/C++程式的記憶體布局---來自unix環境進階程式設計

  1,正文段。這是由C P U執行的機器指令部分。通常,正文段是可共享的,是以即使執行的程式(如文本編輯程式、C編譯程式、s h e l l等)在存儲器中也隻需有一個副本,另外,正文段常常是隻讀的,以防止程式由于意外事故而修改其自身的指令。

  2,初始化資料段(data段).通常将此段稱為資料段,它包含了程式中需賦初值的變量。例如, C程式中任何函數之外的說明:int maxcount = 99;使此變量以初值存放在初始化資料段中。存初始化的全局變量和static變量,另外還有文字常量區,常量字元串就是放在這裡,程式結束後有系統釋放

  3,非初始化資料段(BSS段)。通常将此段稱為b s s段,這一名稱來源于早期彙程式設計式的一個操作符,意思是“block started by symbol(由符号開始的塊)”,在程式開始執行之前,核心将此段初始化為0 這也應該是區分data段和bbs段的原因,data段中的變量值都是從檔案中讀入的,bbs段區域在系統運作時已經全部初始化為0。函數外的說明:long sum[1000] ;使此變量存放在非初始化資料段中。存未初始化的全局變量和static變量

  4, 棧。自動變量以及每次函數調用時所需儲存的資訊都存放在此段中。每次函數調用時,其傳回位址、以及調用者的環境資訊(例如某些機器寄存器)都存放在棧中。然後,新被調用的函數在棧上為其自動和臨時變量配置設定存儲空間。通過以這種方式使用棧, C函數可以遞歸調用。

  5 堆。通常在堆中進行動态存儲配置設定。由于曆史上形成的慣例,堆位于非初始化資料段頂和棧底之間。

下圖說明了每個部分存儲的類型:

C/C++程式的記憶體布局---來自unix環境進階程式設計

注:上圖中Global data全局資料區其實就是對應于“初始化資料段”和“非初始化資料段”部分。