有堆栈分配可以理解许多相关问题
什么和在哪里堆栈和堆?
为什么会出现在堆栈大小有限制吗?
栈和堆存储器的大小
然而在各种* nix的机器,我可以发出bash命令
ulimit -s unlimited
或csh命令
set stacksize unlimited
这是如何变化的程序是如何执行的? 有没有对程序或系统性能的影响(如,为什么不这是默认的)?
在更多的情况下系统的详细信息是相关的,我主要关注与在x86_64硬件上运行的Linux上的GCC编译的程序。
有堆栈分配可以理解许多相关问题
什么和在哪里堆栈和堆?
为什么会出现在堆栈大小有限制吗?
栈和堆存储器的大小
然而在各种* 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)的几个级分增加的性能。
过失,堆栈大小的确可以是无限的。 _STK_LIM
是默认的, _STK_LIM_MAX
是什么,每个体系结构不同,如可以从中可以看出include/asm-generic/resource.h
:
/*
* 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
被定义为,在情况下,它是无穷-它是无限的。 有关这意味着什么将其设置为无穷大,它可能有什么含义,指的是对方的回答细节,它的方法比我好。
“的ulimit -s无限”让栈增长无限。 这可能会阻止你的程序崩溃,如果你写的程序由递归,特别是如果你的程序是不是尾递归(编译器能够“优化”的),以及递归的深度大。
通过@seisvelas答案几乎包含正确答案的问题。 但是,它是埋在虚假索赔的许多深 - 看评论。 因此,我觉得有义务写这个答案。