教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

C++培訓之內存分區(qū)

更新時間:2016年08月26日16時32分 來源:傳智播客C++培訓學院 瀏覽次數:

內存分區(qū)
C代碼經過預處理、編譯、匯編、鏈接4步后生成一個可執(zhí)行程序。
 
在 Linux 下,程序是一個普通的可執(zhí)行文件,以下列出一個二進制可執(zhí)行文件的基本情況:
 
 
通過上圖可以得知,在沒有運行程序前,也就是說程序沒有加載到內存前,可執(zhí)行程序內部已經分好3段信息,分別為代碼區(qū)(text)、數據區(qū)(data)和未初始化數據區(qū)(bss)3 個部分(有些人直接把data和bss合起來叫做靜態(tài)區(qū)或全局區(qū))。
 
  • 代碼區(qū)
存放 CPU 執(zhí)行的機器指令。通常代碼區(qū)是可共享的(即另外的執(zhí)行程序可以調用它),使其可共享的目的是對于頻繁被執(zhí)行的程序,只需要在內存中有一份代碼即可。代碼區(qū)通常是只讀的,使其只讀的原因是防止程序意外地修改了它的指令。另外,代碼區(qū)還規(guī)劃了局部變量的相關信息。
 
  • 全局初始化數據區(qū)/靜態(tài)數據區(qū)(data段)
該區(qū)包含了在程序中明確被初始化的全局變量、已經初始化的靜態(tài)變量(包括全局靜態(tài)變量和局部靜態(tài)變量)和常量數據(如字符串常量)。
 
 
  • 未初始化數據區(qū)(又叫 bss 區(qū))
存入的是全局未初始化變量和未初始化靜態(tài)變量。未初始化數據區(qū)的數據在程序開始執(zhí)行之前被內核初始化為 0 或者空(NULL)。
 
程序在加載到內存前,代碼區(qū)和全局區(qū)(data和bss)的大小就是固定的,程序運行期間不能改變。然后,運行可執(zhí)行程序,系統把程序加載到內存,除了根據可執(zhí)行程序的信息分出代碼區(qū)(text)、數據區(qū)(data)和未初始化數據區(qū)(bss)之外,還額外增加了棧區(qū)、堆區(qū)。
 
 
 
  • 代碼區(qū)(text segment)
加載的是可執(zhí)行文件代碼段,所有的可執(zhí)行代碼都加載到代碼區(qū),這塊內存是不可以在運行期間修改的。
 
  • 未初始化數據區(qū)(BSS)
加載的是可執(zhí)行文件BSS段,位置可以分開亦可以緊靠數據段,存儲于數據段的數據(全局未初始化,靜態(tài)未初始化數據)的生存周期為整個程序運行過程。
 
  • 全局初始化數據區(qū)/靜態(tài)數據區(qū)(data segment)
加載的是可執(zhí)行文件數據段,存儲于數據段(全局初始化,靜態(tài)初始化數據,文字常量(只讀))的數據的生存周期為整個程序運行過程。
 
  • 棧區(qū)(stack)
棧是一種先進后出的內存結構,由編譯器自動分配釋放,存放函數的參數值、返回值、局部變量等。在程序運行過程中實時加載和釋放,因此,局部變量的生存周期為申請到釋放該段??臻g。
 
  • 堆區(qū)(heap)
堆是一個大容器,它的容量要遠遠大于棧,但沒有棧那樣先進后出的順序。用于動態(tài)內存分配。堆在內存中位于BSS區(qū)和棧區(qū)之間。一般由程序員分配和釋放,若程序員不釋放,程序結束時由操作系統回收。
 
 本文版權歸傳智播客C++培訓學院所有,歡迎轉載,轉載請注明作者出處。謝謝!
作者:傳智播客C/C++培訓學院
首發(fā):http://xamj520.com/c/ 
0 分享到:
和我們在線交談!