天天看點

BSS段、資料段和代碼段

一個可執行程式包括BSS段,資料段和代碼段(又稱文本段)。

bss segment ,data segment ,code/text segment

BSS(Block by Start Symbol) :通常指用來存放程式中未初化的全局變量和靜态變量的一塊記憶體區域。

BSS段屬于靜态記憶體配置設定。

特點是:可讀寫的,在程式執行之前BSS段為自動清零,是以未初始的全局變量在程式執行之前已經成零了。

_________________________________________________________________________________

資料段:通常用來存放程式中已初始化的全局變量和靜态變量的一塊記憶體區域。

DATA segment 屬于靜态記憶體配置設定。

代碼段:通常是指用來存放程式代碼的一塊記憶體區域,這部分區域的大小在程式運作前就已确定,并且記憶體區域通常屬于隻讀,某些架構允許代碼段可寫,即可以修改,在代碼段中,也有可能包含一些隻讀的常數變量,例如字元串變量等。

堆(heap):用于存放程式中被動态配置設定的記憶體段,大小不固定,可動态擴大或縮減, malloc /free 

棧(stack):用來存放程式臨時建立的局部變量,但不包括static聲明的變量。除此之外,在函數被調用時,其參數也會被壓入發起調用的堆棧中,并且待到調用結束後,函數的傳回值也會被放會棧中,由于棧的先進後出的特點,是以棧特别友善用來儲存/恢複調用現場,從這個意義來講,我們可以把堆棧看成一個寄存、交換臨時資料的記憶體區。

DEMO:

program 1:

int ar[30000];
int main(void)
{
	....
}
           

program 2:

int ar[30000]={1,2,3,4,5,6};
int main(void)
{
	....
}
           

在VS中跑了一下這兩段代碼,發現program 1編譯出來的.exe的大小為28KB,program 2編譯出來的.exe的大小為172KB.

差別在于一個位于BSS段,另一個位于DATA段。兩者的差別在于:全局的未初始化變量存在于.bss段,具體展現為一個點位符;全局的已初始化變量存于.data段,而函數内的自動變量在棧上配置設定存儲空間。.bss段是不占用.exe檔案空間的,其内容由作業系統初始化為0,而.data段卻需要占用,其内容由程式進行初始化,是以造成了上述情況。

bss段(未手動初始化的資料)并不給該段的資料配置設定空間,隻是記錄資料所需空間的大小。

data段(已手動初始化的資料)段則為資料配置設定空間,資料儲存在目标檔案中。

資料段包含經過初始化全局變量以及它們的值。BSS段的大小從可執行檔案中得到,然後連結器得到這個大小的記憶體塊,緊跟在資料段的後面。當這個記憶體區進入程式的位址空間後全部清零。包含資料段和BSS段的整個區段通常稱為資料區。