可以理解的是,有很多关于堆栈分配的相关问题
但是在各种 *nix 机器上我可以发出 bash 命令
ulimit -s unlimited
或 csh 命令
set stacksize unlimited
这如何改变程序的执行方式?
如果有更多相关的系统细节,我主要关心在 x86_64 硬件上运行的 Linux 上使用 GCC 编译的程序。
答案
当您调用函数时,会在堆栈上分配一个新的"命名空间"。
为了限制程序使用大量堆栈空间,通常通过以下方式进行限制ulimit -s
。ulimit -s unlimited
,我们的程序将能够不断地消耗 RAM 来支持不断增长的堆栈,直到最终系统完全耗尽内存。
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 上)。