【发布时间】:2010-09-22 11:18:15
【问题描述】:
我有一个循环如下
while(1)
{
int i;
}
每次循环发生时,i 是否会在堆栈上被销毁并重新创建?
【问题讨论】:
我有一个循环如下
while(1)
{
int i;
}
每次循环发生时,i 是否会在堆栈上被销毁并重新创建?
【问题讨论】:
理论上,它会被重新创建。实际上,出于优化原因,它可能会保持活动状态并重新初始化。
但从您的角度来看,它会被重新创建,并且编译器会处理优化(即,只要它是 pod 类型,就将其保持在最里面的范围内)。 p>
【讨论】:
不一定。您的编译器可以选择将其更改为
int i;
while(1) {
...
i = 0;
}
它可能不是每次都在堆栈上创建和销毁。但是,从语义上讲,这就是发生的情况,当您在 C++ 中使用具有自定义销毁行为的更复杂的类型时,就会发生这种情况,尽管编译器仍可能选择单独保存堆栈内存。
【讨论】:
i = 0 来自哪里?堆栈变量在 C 或 C++ 中没有默认值。
从概念上讲,是的。但是由于没有对值做任何事情,编译器很可能会在循环的每次迭代中生成对变量不做任何事情的代码。例如,它可以提前分配(当函数进入时),因为它会在以后使用。
由于您不能引用定义范围之外的变量,因此不会改变语义。
【讨论】:
在C 中,您必须查看生成的程序集才能知道这一点(编译器可能已选择将其放入寄存器)。
您知道的是,在循环之外,您无法通过任何方式访问该特定对象(通过名称、通过指针、通过 hack,...)
【讨论】: