关于callstack:为什么堆栈大小有限制?

Why is there a limit on the stack size?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What and where are the stack and heap

我安装的Ubuntu的默认堆栈大小限制为8 MB。但我很好奇为什么我们需要限制用户程序的堆栈大小。同一个程序可以通过malloc/mmap等方式使用其所有的4GB(对于32位程序)可寻址空间,那么为什么我们需要堆栈大小限制呢?为什么堆栈在接近堆之前不能增长?


事实上,堆栈确实越来越大。它不需要开始很大,因为在一般情况下,它不需要很大。把它做得很大会导致浪费内存。

我不能百分之百确定栈是如何在Linux上实现的,但是在Windows上,为栈保留了大量的空间。这个数量可以在编译器选项中设置(对于深度递归的程序,您可能需要更大的堆栈)。在运行时,可以通过保护页系统动态扩展堆栈。在堆栈的末尾有一个保护页,当点击时,该保护页会将堆栈扩展一个额外的页面,并将保护页向前推一个页面。

堆栈探测是另一个有趣且相关的概念。所以你的问题是,"为什么堆栈在接近堆之前不能增长?"堆栈确实在增长,但由于大多数时候拥有一个巨大的堆栈可能是错误不希望的副作用,所以保留的大小不会很大(尽管这是可设置的)。

这篇文章很有趣,与你的问题有关。