Det*_*ant 11 c++ stack-overflow
struct MemBlock {
char mem[1024];
MemBlock operator*(const MemBlock &b) const {
return MemBlock();
}
} global;
void foo(int step = 0) {
if (step == 10000)
{
global = global * MemBlock();
}
else foo(step + 1);
}
int main() {
foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
程序接收信号SIGSEGV,分段故障.foo中的0x08048510(步骤= 4000)at t.cpp:12 12 void foo(int step = 0){
似乎MemBlock()实例虽然还没有被调用,但是花费了大量的堆栈内存(检查gdb信息).
而当我使用时global = global * global,程序正常退出.
任何人都可以解释内在的机制吗?
eca*_*mur 15
无论内部的控制流如何,编译器都会MemBlock在每次调用时为实例保留堆栈空间.这是一种常见的优化,可以防止在函数内重复调整堆栈指针.相反,编译器计算所需的最大堆栈空间,并在进入函数时调整堆栈指针的数量.foofoo
正如您所观察到的,这会导致为实际不使用的对象保留的堆栈空间不足.答案是不这样做; 如果你只在某些分支中使用一些大型足迹对象,那么将这些分支分离出来自己的功能.
顺便说一句,这就是为什么古老版本的C需要在函数顶部声明所有函数范围变量的原因; 这样编译器就可以轻松计算出函数需要多少堆栈空间.