考虑这个非常简化的示例函数(伪代码)
void Foobar(long nested) {
if( --nested >= 0)
Foobar(nested);
}
Run Code Online (Sandbox Code Playgroud)
每次调用(至少)将返回地址压入堆栈。
问题:你需要多少内存?
确切地。这就是原因。
不。
编译器只能知道在运行时发生了什么非常有限的扩展。例如,它无法判断执行以下函数需要多少堆栈:
void foo() {
int x = 0;
std::cin >> x;
if (x == 42) foo();
}
Run Code Online (Sandbox Code Playgroud)
Stack 是一种有限的资源,如果超过它,就会出现 stackoverflow。