美文网首页
内存的5大区域

内存的5大区域

作者: 小白PK大牛 | 来源:发表于2020-03-17 11:46 被阅读0次

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

    相关文章

      网友评论

          本文标题:内存的5大区域

          本文链接:https://www.haomeiwen.com/subject/augzehtx.html