如果我在一组新的大括号内创建一个变量,该变量是从右大括号的堆栈中弹出的,还是一直挂到函数结束?例如:
void foo() {
int c[100];
{
int d[200];
}
//code that takes a while
return;
}
在code that takes a while
部分,d
会占用内存吗?
如果我在一组新的大括号内创建一个变量,该变量是从右大括号的堆栈中弹出的,还是一直挂到函数结束?例如:
void foo() {
int c[100];
{
int d[200];
}
//code that takes a while
return;
}
在code that takes a while
部分,d
会占用内存吗?
不,大括号不充当堆栈框架.在C语言中,大括号只表示一个命名范围,但当控件从堆栈中传出时,没有任何内容被 destruct ,也没有任何内容从堆栈中弹出.
作为编写代码的程序员,您通常可以将其视为堆栈框架.大括号内声明的标识符只能在大括号内访问,因此从程序员的Angular 来看,它们就像是在声明它们时被推到堆栈上,然后在退出作用域时弹出.但是,编译器不必生成在进入/退出时推入/弹出任何内容的代码(通常不需要).
还要注意,局部变量可能根本不使用任何堆栈空间:它们可以保存在CPU寄存器或其他辅助存储位置,也可以完全优化.
因此,从理论上讲,d
数组可能会消耗整个函数的内存.但是,编译器可能会对其进行优化,或者与使用生命周期 不重叠的其他局部变量共享其内存.