为什么要限制栈的大小?

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


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

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

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

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


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


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

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

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

_________________

猜你喜欢

转载自blog.csdn.net/qq_41786318/article/details/80540838
今日推荐