为什么要限制栈的大小?

栈大小不够用不是容易出现溢出吗?


是为了阻止不靠谱的程序员进入这个行业。 

当然,真正的原因其实是栈的地址空间必须连续,如果任其任意成长,会给内存管理带来困难。对于多线程程序来说,每个线程都必须分配一个栈,因此没办法让默认值太大。 

当然可能有人会说64位系统上这个不是问题,但大家反正已经用了32位系统这么多年(只有4GB甚至2GB地址空间是可以给用户用的),已经习惯了,而且现代化的内存分配器通过类似slab allocator这样的设计已经尽可能令相关数据尽可能放在一起,从CPU数据缓存角度,绝大多数程序并不需要在栈上分配内存(题外话:栈缓冲区溢出的后果比堆缓冲区溢出要严重许多,而在堆上分配缓冲区则可以避免前者)。
semiconductor 写到:

64位系统上这个不是问题,64位系统下的状况是什么样的?


任何情况下必须满足下列不等式: 
引用:
堆栈地址最大值×线程数目最大值<用户态内存地址最大值


而64位系统上用户态内存地址可以超过4G啊。 

其实无论如何都会有限制的。就算你电脑上只跑一个单进程单线程,一头是程序代码,静态数据,malloc 自由分配的堆内存,另一头是堆栈。只要不停地让堆栈生长(调用的函数层次足够深,在堆栈上分配大量局部变量,比如大数组什么的),由于存储容量一定是一个有限值,堆栈迟早要把另一头的东西吃掉,那样你就麻烦了。 

最常见的是写的递归算法中有错误,反复压栈,导致溢出。由于合理的算法不会消耗太多堆栈空间,所以可以规定一个值,超过了红牌罚下。

_________________

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值