C++—程序的內存分區

  • 代碼區html

    ​ 程序被操做系統加載到內存時,全部可執行的代碼被加載到代碼區,也叫代碼段,存儲程序的代碼指令。程序運行時,這段區域數據不可被修改只能夠被執行。c++

  • 靜態區程序員

    ​ 程序中的靜態變量、全局變量存放在此區域(初始化的全局變量和靜態變量在一塊區域)。代碼執行期間一直佔用內存!函數

  • 優化

    ​ 堆是不連續的內存區域,得到的空間比較靈活,也比較大,通常速度比較慢,並且容易產生內存碎片,不過用起來最方便。須要程序員申請的內存空間,空間的釋放通常由程序員控制(好比new, delete, malloc, free)。當程序員沒有釋放該內存空間的時候,程序運行完畢時操做系統會對該內存空間進行回收。操作系統

  • code

    ​ 棧是一塊連續的內存的區域,通常棧的大小都是預先設置好的,若是申請的空間超過棧的剩餘空間時,將提示overflow。存放的一般是變量一般是局部變量、函數參數等。htm

  • 文字常量區對象

    ​ 常量字符串就是放在這裏的。 程序結束後由系統釋放。blog

  • bss段

    ​ 定義而沒有賦初值的全局變量和靜態變量,放在這個區域,一般只是記錄變量名和大小,至關於一個佔位符。

​ 一個程序本質上都是由.bss段、.data段、.text段三個組成的。.data段包含三個部分:heap(堆)、stack(棧)和靜態數據區。.text段存放代碼區。.bss 裏面裝載了未被初始化的數據;如圖:

ELF文件

示例以下:

int a = 0; //全局初始化區(靜態區) 
char *p1;  //全局未初始化區 (BSS段)
int main() 
{ 
    int b; //棧 
    char s[] = "abc"; //棧 
    char *p2; //棧 
    char *p3 = "123456"; //123456/0在常量區,p3在棧上。 
    static int c = 0; //全局(靜態)初始化區 (靜態區)
    p1 = (char *)malloc(10); //分配得10和20字節的區域就在堆區。 
    p2 = (char *)malloc(20); 
    strcpy(p1, "123456");  
    //123456/0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一塊。
    return 0;
}

能夠聯合以前所寫的關於連接的一些總結,引用那張圖以下:

多個可重定位對象文件合併成可執行文件的過程
相關文章
相關標籤/搜索