运行时堆栈溢出
如果编译器在运行前计算出需要的栈大小,那么栈溢出是怎么发生的呢?在编译时,编译器是否计算整个程序堆栈所需的内存总量?
回答
不。
编译器只能知道在运行时发生了什么非常有限的扩展。例如,它无法判断执行以下函数需要多少堆栈:
void foo() {
int x = 0;
std::cin >> x;
if (x == 42) foo();
}
Stack 是一种有限的资源,如果超过它,就会出现 stackoverflow。
如果编译器在运行前计算出需要的栈大小,那么栈溢出是怎么发生的呢?在编译时,编译器是否计算整个程序堆栈所需的内存总量?
不。
编译器只能知道在运行时发生了什么非常有限的扩展。例如,它无法判断执行以下函数需要多少堆栈:
void foo() {
int x = 0;
std::cin >> x;
if (x == 42) foo();
}
Stack 是一种有限的资源,如果超过它,就会出现 stackoverflow。