堆栈的区别

管理方式不同

  • 栈是由编译器自动管理,无需我们手工控制
  • 堆的释放工作是由程序员控制,容易产生memory leak(内存泄漏)

生长方向不同

栈是向下生长,堆是向上生长

空间大小不同

  • 由于栈是向下增长,所以它的大小受限于系统(软限制),windows下为1M,Linux下为8M。Linux命令行中输入:“ ulimit -a ”便可以显示栈的大小
  • 而栈是向上增长,所以它的大小受限于计算机的虚拟内存空间大小(硬限制)

能否产生碎片不同

  • 堆:频繁地进行new和delete会导致内存空间不连续,从而产生大量的内存碎片,使程序的效率降低
    在这里插入图片描述
  • 栈:是先入后出的队列,要释放一片内存,必须得先把它后面(后进)的内存释放掉,所以不存在内存不连续的情况,自然也就不会产生内存碎片

分配方式不同

  • 只能是是动态分配,由用户自行申请空间分配
  • 栈可以是动态分配,也可以是静态分配。静态分配是由编译器完成,比如局部变量的申请;动态分配由函数alloca实现,它的释放是由编译器进行释放,无需手动释放。

分配效率不同

  • 栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这决定了栈的分配效率高
  • 堆是由C/C++库提供的,机制很复杂,所以分配效率比栈低很多
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值