如果我在一组新的花括号中创建了一个变量,那么该变量是在右大括号上从堆栈中弹出的,还是会一直挂到函数的末尾?例如:
void foo() {
int c[100];
{
int d[200];
}
//code that takes a while
return;
}
在code that takes a while
部分期间,d
是否会占用内存?
发布于 2010-05-04 00:03:49
不,大括号不起堆栈框架的作用。在C中,大括号只表示一个命名作用域,但是当控制传递到堆栈之外时,没有任何东西会被销毁,也不会从堆栈中弹出任何东西。
作为编写代码的程序员,您通常可以将其视为堆栈框架。在大括号内声明的标识符只能在大括号内访问,因此从程序员的角度来看,它们就像是在声明它们时被推送到堆栈上,然后在退出作用域时弹出。但是,编译器不必生成在进入/退出时推入/弹出任何内容的代码(通常情况下,它们不需要)。
还要注意,局部变量可能根本不使用任何堆栈空间:它们可以保存在CPU寄存器或其他辅助存储位置,也可以完全优化。
因此,从理论上讲,d
数组可能会消耗整个函数的内存。但是,编译器可能会对其进行优化,或者与使用寿命不重叠的其他局部变量共享其内存。
发布于 2010-05-04 00:40:49
它依赖于实现。我写了一个简短的程序来测试gcc 4.3.4做了什么,它在函数开始时一次性分配了所有的堆栈空间。您可以使用-S标志检查gcc生成的程序集。
发布于 2010-05-04 00:07:56
我相信它确实超出了作用域,但在函数返回之前不会从堆栈中弹出。因此,在函数完成之前,它仍将占用堆栈上的内存,但在第一个右大括号的下游不可访问。
https://stackoverflow.com/questions/2759371
复制相似问题