有没有办法在c ++中知道最大递归深度而不显式调用递归直到它崩溃?
我已经看到它受到堆栈大小的限制。也许在特定的递归级别找到堆栈中的可用空间量是有用的。有可能吗?
答案 0 :(得分:2)
我现在唯一能想到的就是使用getrlimit
来获取专用于您的流程的堆栈的最大大小。接下来要做的是找到一种获取当前使用的堆栈大小的方法。我认为getrusage
是要走的路,但在查看man
页面和SO上的几个帖子之后,它似乎不再支持这个特定功能了。所以你必须找到另一种方式。我相信Valgrind
也会报告堆栈使用情况,因此查看其源代码和文档可能会很有用。
一旦你能够获得当前的堆栈大小,你就可以测量
在开始递归之前的初始状态(这样你就可以从计算中排除它,因为它与递归本身没有任何关系)
单次迭代的更改
排除初始堆栈分配以及使用总堆栈大小和单个递归步骤所需的分配,您应该能够估计给定系统可以具有的递归次数。即使准确高度依赖于您正在使用的系统,我也不确定它是否会起作用以及此类测量(在所有堆栈与进程可以具有的虚拟内存量密切相关之后)
答案 1 :(得分:2)
最大递归深度取决于函数使用的内存量,平台上的内存量以及操作系统或编译器的限制(如果有)。
在递归调用中,内存占用:
没有参数和没有局部变量的递归函数将具有比传递大量大型对象并占用大量局部变量的函数更高的可能深度(递归调用的数量)。
因此,您的问题的答案是:递归调用的最大数量取决于递归调用占用的内存量,系统上的内存量以及编译器或操作系统施加的任何限制。不同的递归函数占用不同的内存量。
如果您知道所有这些项目,那么您可以计算可能的递归的最大数量。