堆栈区别

1、管理方式不同;
栈由编译器自动分配和释放,而堆需要程序员来手动分配和释放,若忘记delete,容易产生内存泄漏。

2、空间大小不同;
栈的内存空间是连续的,空间大小通常是系统预先规定好的,即由栈顶地址和最大空间是确定的;
而堆得内存空间是不连续的,由一个记录空闲空间的链表负责管理,因此内存空间几乎没有限制,
在32位系统下,内存空间大小可达到4G

3、能否产生碎片不同;
由于栈的内存空间是连续的,先进后出的方式保证不会产生零碎的空间,
因为永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出;

而堆分配方式是每次在空闲链表中遍历到第一个大于或等于申请空间的节点,
每次分配的空间大小一般不会正好等于申请的内存大小,频繁的new/delete势必会造成内存空间的不连续,
从而造成大量的碎片,使程序效率降低

4、生长方向不同;

 
对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;(向高地址方向增长)
对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。(向低地址方向增长)

5、分配方式不同;

 
堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。
静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,
但是栈的动态分配和堆是不同的,栈的动态分配是由编译器进行释放,而堆的动态分配是手动释放的。

6、分配效率不同;
栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,
压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。

堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法
在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),
就有可能调用系统功能去增加程序数据段的内存空间(需要额外的处理),这样就有机会分到足够大小的内存,
然后进行返回。
显然,堆的效率比栈要低得多。

从这里我们可以看到,堆和栈相比,由于大量new/delete的使用,容易造成大量的内存碎片;
由于没有专门的系统支持,效率很低;由于可能引发用户态和核心态的切换,内存的申请,代价变得更加昂贵。
所以栈在程序中是应用最广泛的,就算是函数的调用也利用栈去完成,函数调用过程中的参数,返回地址,
EBP和局部变量都采用栈的方式存放。所以,我们推荐大家尽量用栈,而不是用堆。
虽然栈有如此众多的好处,但是由于和堆相比不是那么灵活,有时候分配大量的内存空间,还是用堆好一些。


无论是堆还是栈,都要防止越界现象的发生(除非你是故意使其越界),因为越界的结果要么是程序崩溃,
要么是摧毁程序的堆、栈结构,产生以想不到的结果,就算是在你的程序运行过程中,没有发生上面的问题,
你还是要小心,说不定什么时候就崩掉,那时候debug可是相当困难的:)

推荐:https://blog.csdn.net/caogenwangbaoqiang/article/details/79788368

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值