内存的5大区域


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);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。