如果编译器在运行前计算了所需堆栈的大小,那么堆栈溢出是如何发生的呢?编译器是否会在编译时计算整个程序所需的堆栈总内存量?
如果编译器在运行前计算了所需堆栈的大小,那么堆栈溢出是如何发生的呢?编译器是否会在编译时计算整个程序所需的堆栈总内存量?
不行。
编译器只能在非常有限的程度上了解运行时发生的情况。例如,它无法判断执行以下函数所需的栈大小:
void foo() {
int x = 0;
std::cin >> x;
if (x == 42) foo();
}
栈是一种有限资源,如果超过了它的极限,就会出现栈溢出(stackoverflow)。
void Foobar(long nested) {
if( --nested >= 0)
Foobar(nested);
}
每次调用都会将(至少)返回地址推入堆栈。
问题:你需要多少内存?
确切地说,这就是原因。
alloca
等调用完成的。