【发布时间】:2021-03-23 23:55:03
【问题描述】:
重复运行以下 C++ 程序会在出现分段错误之前给出不同的最大递归调用数(相差大约 100 个函数调用)。
#include <iostream>
void recursion(int i)
{
std::cout << "iteration: " << ++i << std::endl;
recursion(i);
}
int main()
{
recursion(0);
};
我用
编译了文件main.cpp
g++ -O0 main.cpp -o main
Here 和here 针对 java 讨论了与上述相同的问题。在这两种情况下,答案都是基于 java 相关概念、JIT、垃圾回收、HotSpot 优化器等。
为什么 C++ 的最大递归数会有所不同?
【问题讨论】:
-
未定义的行为是未定义的。在不同的运行中没有什么异常会产生不同的结果。没有人答应过你。
-
我不知道 infinite recursions 是 C++ 中未定义的行为,这解释了问题的 C++ 方面。但是在终止/终止进程之前操作系统“允许”的操作数量存在一些差异 - 至少在堆栈已满时?
-
ASLR 可能对此负责,请尝试禁用它,看看会发生什么。
-
禁用 ASLR 会导致递归次数恒定。这回答了问题的操作系统方面。谢谢!我在下面记录了我所做的事情。
标签: c++ function recursion stack