1. 程式人生 > >資料段、程式碼段、堆疊段、BSS段 學習整理

資料段、程式碼段、堆疊段、BSS段 學習整理

今天寫程式的時候發現生成的exe比前兩天的大了很多,故上網查了一下記憶體相關知識,總結一下

5個數據段 

程序(執行的程式)會佔用一定數量的記憶體,它或是用來存放從磁碟載入的程式程式碼,或是存放取自自使用者輸入的資料等。不過程序對這些記憶體的管理方式因記憶體用途不一而不盡相同,有些記憶體是事先靜態分配和統一回收的,而有些確實按需要動態分配和回收的。對於任何一個普通程序來講,它都會涉及到5種不同的資料段。

BSS段:BSS段(bss segment)通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。BSS是英文Block Started  By Symbol的簡稱。BSS段屬於靜態記憶體分配。

資料段:資料段(data segment)通常是指用來存放程式中已初始化的全域性變數的一塊記憶體區域。資料段屬於靜態記憶體分配。

程式碼段:程式碼段(code segment/text segment)通常是指用來存放程式執行程式碼的一塊記憶體區域。這部分割槽域的大小在程式執行前就已經確定,並且記憶體區域通常屬於只讀,某些框架也允許程式碼段可寫,即允許修改程式。在程式碼段中,也有可能包含一些只讀的常量變數,例如字元常量等。

堆(heap):堆是用來存放程序執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減。當程序呼叫mallloc等函式分配記憶體時,新分配的記憶體就被動態新增到堆上(堆被擴張);當利用free等函式釋放記憶體時,被釋放的記憶體從堆中被剔除。

棧(stack):棧又稱堆疊,是使用者存放程式臨時建立的區域性變數,也就是說我們函式中定義的變數但不包括static宣告的變數,static意味著在資料段中存放變數。除此之外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待呼叫結束後,函式的返回值也會被存放回棧中。由於棧的先進後出特點,所以棧特別方便用來儲存/恢復呼叫現場。從這個意義上講,我們把堆疊看成一個寄存、交換臨時資料的記憶體區。

它是由作業系統分配的,記憶體的申請與回收都由OS 管理。

PS: 

全域性的未初始化變數存在於.bss段中,具體佔用一個佔位符;全域性的已初始化變數存於.data段中;而函式中的自動變數都在棧上分配空間。.bss是不佔用.exe檔案空間的,其內容由作業系統初始化(清零);而data卻需要佔用,其內容由程式初始化,因此造成了上述情況。

bss段並不給該段資料分配空間,只是記錄資料所需空間的大小。

data段為資料分配空間,資料儲存在目標檔案中。資料段包含經過初始化的全域性變數以及它們的值。BSS段的大小從可執行檔案中得到,然後連結器得到這個大小的記憶體塊,緊跟在資料段後面。當這個記憶體區進入程式的地址空間後全部清零。包括資料段和BSS段的整個區段此時通常稱為資料段。

程式碼段、資料段、棧是CPU級別的邏輯概念,堆是語言級別的邏輯概念

程式碼段、資料段、堆疊段,這是一個概念
堆、棧、全域性區、常量區,這是另一個概念

#include <stdio.h>
#include <stdlib.h>
 
int inbss ;       //全域性未初始化 位於BSS段,存放在程式組未初始化的記憶體區域  
int indata = 100 ;  //全域性初始化 位於資料段,存放在程式中已經初始化的記憶體區域 
static int sta ; //靜態段 

int main(void)
{
	static int  k  ;  //靜態段 data 
    static int c =0; 全域性(靜態)初始化區 
	int i , j ;   //棧段 記憶體自動申請自動釋放 
    char s[] = "abc"; //棧 
	char *p2; //棧 
    char *p3 = "Hello"; //Hello在常量區,p3在棧上。
    char p1 = (char *)malloc(10); //分配得來得10的區域就在堆區。
    free(p1);  
    char* p=new char[6];//堆段 記憶體手動申請
    strcpy(p,"Hello");//Hello放在常量區,編譯器可能會將它與p3所指向的"Hello"優化成一個地方。
    std::cout<<*p<<std::endl; //只是輸出p指向的字串的第一個字元!
    std::cout<<p<<std::endl; //輸出p指向的字串!
    delete[] p; //堆段  手動釋放 
	
	return 0 ;
}

參考連結:

https://blog.csdn.net/morixinguan/article/details/50927333?utm_source=blogxgwz0