C++—程序的內存分區


  • 代碼區

    ​ 程序被操作系統加載到內存時,所有可執行的代碼被加載到代碼區,也叫代碼段,存儲程序的代碼指令。程序運行時,這段區域數據不可被修改只可以被執行。

  • 靜態區

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

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

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

  • 文字常量區

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

  • 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;
}

可以聯合之前所寫的關於鏈接的一些總結,引用那張圖如下:

![多個可重定位對象文件合並成可執行文件的過程](https://img2018.cnblogs.com/blog/1047362/201901/1047362-20190126161447331-197666169.jpg)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM