堆跟栈的比较
分配位置->分配方式->分配空间大小限制->分配效率->连续性->生命周期->内存碎片及管理->内存泄漏->安全性->结构与应用
1.分配位置
堆被分配到靠近.bss段的低地址区,并向高地址区增长;
栈被分配到靠近命令行参数区下面的高地址区,并先低地址方向增长;
2.分配方式
堆是我们手动分配与释放的,而栈由系统分配(例如局部变量等就是存在于栈区)
3.分配空间大小限制
一般栈区是M数量级,堆是G数量级,Linux可以通过
ulimit -a 查看大小;
4.分配效率
显然系统分配的效率大于手动分配,及栈区内存分配效率高于堆区内存分配;
5.连续性
堆或栈分配好了,但是在内存上的布局也是有区别的。
栈内存是连续的一片区域,而堆由于是动态分配的,因此不是连续的;
6.生命周期
栈区变量随着调用函数的结束而销毁;
堆区变量需要手动释放或者程序结束才销毁;
7.内存碎片
前面提到,堆区内存不是连续的,而且是动态分配的,故容易导致内存碎片问题,而栈区内存不存在该问题;
因此,堆内存是通过链表结构来管理的,系统将空闲内存块以链表节点形式组织起来,而栈内存管理类似与队列机制,只要队列不满,即可分配栈内存;
8.内存泄漏
由于堆区是手动分配管理的,但某个堆区内存分配了但是忘记手动释放时,就产生了内存泄漏问题;
而栈区由系统统一管理,不存在该问题;
9.安全性
一方面栈区空间较小,一旦程序逻辑不恰当(例如无限递归)就可能导致栈溢出问题;
堆区更多的时内存泄漏的风险
10.结构与应用
栈区一般用于存放局部变量及函数参数
而堆区空间大且可以动态分配,一般用于大的数据结构,例如动态数组等;