但是在各种* nix机器上,我可以发出bash命令
ulimit -s unlimited
或csh命令
set stacksize unlimited
这如何改变程序的执行方式?对程序或系统性能有任何影响(例如,为什么不将其设置为默认值)?
如果需要更多系统详细信息,我主要关心的是在x86_64硬件上运行的Linux上使用GCC编译的程序。
调用函数时,将在堆栈上分配一个新的“命名空间”。这就是函数可以具有局部变量的方式。作为函数调用函数,而函数又依次调用函数,我们不断在堆栈上分配越来越多的空间以维护命名空间的这种深层次结构。
为了限制使用大量堆栈空间的程序,通常通过设置一个限制ulimit -s。如果我们通过删除该限制ulimit -s unlimited,我们的程序将能够为不断增长的堆栈增加RAM,直到最终系统完全耗尽内存。
ulimit -s
int eat_stack_space(void) { return eat_stack_space(); } // If we compile this with no optimization and run it, our computer could crash.
通常,使用大量堆栈空间是偶然的,或者是非常深层递归的症状,可能不应该过多地依赖堆栈。因此,堆栈限制。
对性能的影响很小,但确实存在。使用该time命令,我发现消除堆栈限制将性能提高了几分之一秒(至少在64位Ubuntu上)。
time