内存的5大区域

2020-03-17  本文已影响0人  小白PK大牛

1.栈区(stack)

栈区:由编译器⾃动分配并释放,存放函数的参数值,局部变量等。栈是系统数据结构,对应线程/进程是唯⼀的。
申请大小:栈是向低地址扩展的数据结构,是⼀块连续的内存的区域。是栈顶的地址和栈的
最⼤容量是系统预先规定好的,栈的⼤⼩是2M(也有的说是1M,总之是⼀个编译时
就确定的常数) ,如果申请的空间超过栈的剩余空间时,将提示溢出,能从栈获得的空间较⼩。
系统响应方法:存储每⼀个函数在执⾏的时候都会向操作系统索要资源,栈区就是函数运⾏时的内存,栈区中的变量由编译器负责分配和释放,内存随着函数的运⾏分配,随着函数
的结束⽽释放,由系统⾃动完成。
注意:只要栈的剩余空间⼤于所申请空间,系统将为程序提供内存,否则将报异常提
示栈溢出。
优点:快速⾼效,不会产生碎片
缺点:有限制,数据不灵活。(先进后出)

栈空间分静态分配和动态分配两种

2.堆区(heap)

堆区: 由程序员分配和释放,用new/alloc方法创建的对象,手动申请空间,如果程序员不释放,程序结束时,可能会由操作系统回收 。
系统响应方法:

3.全局区(静态区) (static)

全局区(静态区):全局变量和静态变量的存储是放在⼀起的,初始化的全局变量和静
态变量存放在⼀块区域,未初始化的全局变量和静态变量在相邻的另⼀块区域,程序结束后

有系统释放。

4.常量去/数据段

用来存储已经初始化的全局变量,静态变量,常量数据,程序结束后由系统释放

5.代码段

存放函数的⼆进制代码(用来存储程序的代码/指令)

//全局初始化区
int a = 10;
//全局未初始化区
char *p;
main {
    //栈区
    int b;
    //栈
    char s[] = "abc";
    //栈
    char *p1;
    //常量区
    char *p2 = "1234";
    //全局(静态)初始化区
    static int c = 0;
    //分配来的10和20字节的区域在堆区
    m = (char *)malloc(10);
    n = (char *)malloc(20);
}
上一篇 下一篇

猜你喜欢

热点阅读