【问题标题】:maximum number of function recursion c++函数递归的最大数量c ++
【发布时间】:2013-02-02 23:23:53
【问题描述】:

假设我们有函数:

void foo(int x)
{
foo(x); 
}

在我的机器 (i7) 上将运行大约 260k 次并产生分段错误。知道为什么会这样吗?

【问题讨论】:

  • 计算机上没有什么是无限的,甚至堆栈大小也没有
  • 260k 相当不错。在其他一些环境中,它会很多。考虑更新/完善问题:标题(允许多少递归)和帖子中的问题(为什么会发生段错误)分歧。

标签: c++ recursion segmentation-fault


【解决方案1】:

每次调用函数时,它都需要运行时堆栈上的空间。这是该函数的本地变量分配内存的地方。正在发生的事情是你递归了很多次,以至于你的堆栈空间用完了——堆栈溢出。 (这个网站的名字!)

另请参阅:http://en.wikipedia.org/wiki/Stack_overflow

【讨论】:

  • +1 .. 但是允许的 最大 递归是多少?这其中有哪些因素?此外,示例案例可以在优化/内联(通过什么/在哪里?)下进行 TCO ..
  • @pst,他的回答不是暗示它类似于(堆栈空间量)/(函数在堆栈上占用的空间量)。我想四舍五入。编辑:这是忽略尾递归,它可以永远持续下去......
  • @DavidD 我只是想得出一个更详细的回应。我有点好奇 C/C++ 是否对这个案例有什么特别要说的(保证、禁止或声明 UB)。
  • @pst:我认为标准没有定义任何限制。事实上,据我所知,标准甚至指定函数调用必须将其本地存储分配完全在堆栈上——只是堆栈是范例 每个人都使用。
  • @sheu 啊,这更像是 - 记得更新答案。
【解决方案2】:

每次调用函数时,系统都会将其调用存储在堆栈中,在这种情况下,系统将继续存储函数调用,直到系统堆栈变满。这种状态称为堆栈溢出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多