首页 > 代码库 > 2017.3.23

2017.3.23

堆和栈的区别

一、申请方式

栈:由系统自动分配

堆:需要程序员自己申请,并指明大小

二、申请后系统的响应

栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出

堆:操作系统有一个记录空间内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆节点,然后将该节点从空闲节点链表中删除,并将该节点的空间分配给程序

三、申请大小的限制

栈:在windows 下,栈是向低地址扩展的数据结构,是一块连续的内存区域。也就是栈顶的地址和栈的最大容量是系统预先规定好了的,在windows 下,栈的大小是2MB.

堆:堆是向高地址扩展的数据结构,是不连续的内存区域。

四、申请效率

栈:由系统自动分配,速度较快,但程序员无法控制

堆:是由new 分配的内存,一般速度比较慢,而且容易产生内存碎片

五、堆和栈中存储的内容

栈:在函数调用时,第一个进栈的是主函数的下一个指令的地址,然后是函数的各个参数,参数是从右往左入栈的,然后是函数中的局部变量。

堆:一般在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。

2017.3.23