栈与堆内存的十个不同

堆跟栈的比较

分配位置->分配方式->分配空间大小限制->分配效率->连续性->生命周期->内存碎片及管理->内存泄漏->安全性->结构与应用

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小凡下方了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值