可以理解,在堆栈分配方面有许多相关的问题
What and where are the stack and heap?
Why is there a limit on the stack size?
但是,在各种*nix机器上,我可以发出bash命令
ulimit -s unlimited或csh命令
set stacksize unlimited这将如何改变程序的执行方式?是否对程序或系统性能有任何影响(例如,为什么这不是默认设置)?
如果有更多相关的系统细节,我最关心的是在x86_64硬件上运行的Linux上用GCC编译的程序。
发布于 2013-01-23 11:05:45
当你调用一个函数时,会在堆栈上分配一个新的“命名空间”。这就是函数可以有局部变量的原因。当函数调用函数,而函数又调用函数时,我们会在堆栈上分配越来越多的空间,以维护这种深层的名称空间层次结构。
为了限制程序使用大量堆栈空间,通常会通过ulimit -s设置限制。如果我们通过ulimit -s unlimited消除这个限制,我们的程序将能够继续为它们不断增长的堆栈吞噬内存,直到最终系统完全耗尽内存。
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上)。
发布于 2013-01-23 11:02:10
堆栈大小可以确实是无限的。从include/asm-generic/resource.h可以看出,_STK_LIM是缺省的,_STK_LIM_MAX是每个体系结构都不同的东西
/*
* RLIMIT_STACK default maximum - some architectures override it:
*/
#ifndef _STK_LIM_MAX
# define _STK_LIM_MAX RLIM_INFINITY
#endif从本例中可以看出,泛型值是无穷大的,其中RLIM_INFINITY在泛型情况下又定义为:
/*
* SuS says limits have to be unsigned.
* Which makes a ton more sense anyway.
*
* Some architectures override this (for compatibility reasons):
*/
#ifndef RLIM_INFINITY
# define RLIM_INFINITY (~0UL)
#endif所以我猜真正的答案是-堆栈的大小可以受到某种架构的限制,那么无限的堆栈跟踪将意味着任何_STK_LIM_MAX的定义,如果它是无限的-它是无限的。有关将其设置为无限的含义以及可能产生的影响的详细信息,请参考另一个答案,它比我的好得多。
发布于 2017-02-14 23:32:58
ulimit -s unlimited让堆栈无限增长。
如果你用递归编写程序,这可能会防止你的程序崩溃,特别是如果你的程序不是尾递归的(编译器可以“优化”它们),而且递归的深度很大。
https://stackoverflow.com/questions/14471564
复制相似问题