我有一个循环如下
while(1)
{
int i;
}
每次循环发生时,i
是否会在堆栈中被销毁并重新创建?
答案 0 :(得分:15)
理论上,它会被重新创建。在实践中,出于优化原因,它可能会保持活力并重新焕发活力。
但是从您的角度来看,它会被重新创建,并且编译器会处理优化(即,将其保持在最内层范围内,只要它是pod类型)。
答案 1 :(得分:4)
不一定。您的编译器可以选择将其更改为
int i;
while(1) {
...
i = 0;
}
每次都可能无法在堆栈上逐字创建和销毁。但是,从语义上讲,就是这种情况,当你在C ++中使用具有自定义销毁行为的更复杂类型时,这正是发生的事情,尽管编译器仍然可以选择单独保存堆栈内存。
答案 2 :(得分:2)
从概念上讲,是的。但是由于没有对值进行任何操作,编译器很可能在循环的每次迭代中生成代码并不对变量执行任何操作。例如,它可以提前分配(当函数进入时),因为它将在以后使用。
由于你不能引用定义范围之外的变量,这不会改变语义。
答案 3 :(得分:2)
在C
中,您必须查看生成的程序集以了解(编译器可能已选择将其放入寄存器)。
你知道的是,在循环外你无法通过任何方式访问该特定对象(通过名称,指针,黑客,...)