内存

 

代码区:存放程序的代码,即CPU执行的机器指令,并且是只读的。

常量区:存放常量(程序在运行的期间不能够被改变的量,例如: 10,字符串常量”abcde”, 数组的名字等)

静态区(全局区):静态变量和全局变量的存储区域是一起的,一旦静态区的内存被分配, 静态区的内存直到程序全部结束之后才会被释放。

堆区:由程序员调用malloc()函数来主动申请的,需使用free()函数来释放内存,若申请了堆区内存,之后忘记释放内存,很容易造成内存泄漏。

栈区:存放函数内的局部变量形参函数返回值。栈区之中的数据的作用范围过了之后,系统就会回收自动管理栈区的内存(分配内存 , 回收内存),不需要开发人员来手动管理。栈区就像是一家客栈,里面有很多房间,客人来了之后自动分配房间,房间里的客人可以变动,是一种动态的数据变动。

1、堆和栈的区别

(1)存储内容

栈:函数的各个参数、局部变量、返回值等等。

堆:头部用一个字节存放堆的大小,具体内容有程序员来安排。

(2)申请方式不同

栈是由系统自动分配释放,而堆是由程序员自己分配释放。

(3)申请大小限制

栈:是一块连续的内存区域,大小是固定的。如果申请的空间超过栈的剩余空间,会提示overflow。

堆:不连续。因为系统使用的是链表来存储空闲内存地址的,所以不连续。比较灵活。

操作系统有一个记录空闲内存地址的链表,收到申请时,会遍历链表,寻找第一个空间大于所申请空间的堆节点,然后将节点懂链表中删掉,并将该节点的空间分配给程序。另外大部分系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,free语句才能正确释放本内存空间。

找到的堆节点的大小不一定正好等于申请的大小,系统会自动将多余的部分重新放回空闲链表中。

(4)效率

栈:系统自动分配,快。

堆:malloc分配,速度慢,而且容易产生碎片。

 

posted @ 2019-09-15 15:50  Austin_anheqiao  阅读(177)  评论(0编辑  收藏  举报