繁体   English   中英

找到最大递归深度

[英]Find maximum recursion depth

有没有办法在c ++中知道最大递归深度而不显式调用递归直到它崩溃?

我已经看到它受到堆栈大小的限制。 也许在特定的递归级别找到堆栈中的可用空间量是有用的。 可能吗?

我现在唯一能想到的就是使用getrlimit来获得专用于进程的堆栈的最大大小。 接下来要做的是找到一种获取当前使用的堆栈大小的方法。 我认为getrusage是要走的路,但在查看man -page和SO上的几个帖子之后,它似乎不再支持这个特殊功能了。 所以你必须找到另一种方式。 我相信Valgrind也会报告堆栈使用情况,因此查看其源代码和文档可能会很有用。

一旦你能够获得当前的堆栈大小,你可以测量

  • 它在你开始递归之前的初始状态(这样你就可以从计算中排除它,因为它与递归本身没有任何关系)

  • 它对单次迭代的改变

排除初始堆栈分配以及使用总堆栈大小和单个递归步骤所需的分配,您应该能够估计给定系统可以具有的递归次数。 我不确定它是否可行以及此类测量即使准确度高度依赖于您正在使用的系统 (在所有堆栈与进程可以具有的虚拟内存量密切相关之后)。

最大递归深度取决于函数使用的内存量,平台上的内存量以及OS或编译器的限制(如果有)。

在递归调用中,内存占用为:

  • 函数调用的开销
  • 传递的参数占用的内存。
  • 局部变量占用的内存

没有参数和没有局部变量的递归函数将具有比传递大量大型对象并占用大量局部变量的函数更高的可能深度(递归调用的数量)。

因此,您的问题的答案是:递归调用的最大数量取决于递归调用占用的内存量,系统上的内存量以及编译器或操作系统施加的任何限制。 不同的递归函数占用不同的内存量。

如果您知道所有这些项目,则可以计算可能的递归的最大数量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM