zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    POJ 3140 Contestants Division (树dp)
    POJ 3107 Godfather (树重心)
    POJ 1655 Balancing Act (树的重心)
    HDU 3534 Tree (经典树形dp)
    HDU 1561 The more, The Better (树形dp)
    HDU 1011 Starship Troopers (树dp)
    Light oj 1085
    Light oj 1013
    Light oj 1134
    FZU 2224 An exciting GCD problem(GCD种类预处理+树状数组维护)同hdu5869
  • 原文地址:https://www.cnblogs.com/helloworldcode/p/10595781.html
Copyright © 2011-2022 走看看