循环中的变量定义

tep*_*pic 3 c loops

我一直在努力养成在他们需要的时候定义琐碎变量的习惯.我一直对编写这样的代码持谨慎态度:

while (n < 10000) {
   int x = foo();
   [...]
}
Run Code Online (Sandbox Code Playgroud)

我知道标准是绝对清楚的,x只存在于循环内部,但这在技术上是否意味着整数将在每次迭代时在堆栈上分配和解除分配?我意识到优化编译器不太可能这样做,但它保证了吗?

例如,写作是否更好:

int x;
while (n < 10000) {
   x = foo();
   [...]
}
Run Code Online (Sandbox Code Playgroud)

我不是故意用这个代码,而是在任何类似的循环中.

我用gcc 4.7.2快速测试了一个简单的循环,这种方式不同并生成了相同的组件,但我的问题是这两个,根据标准,相同吗?

unw*_*ind 6

请注意,"分配"这样的自动变量几乎是免费的; 在大多数机器上,它可以是单指令堆栈指针调整,也可以是编译器使用寄存器,在这种情况下无需进行任何操作.

此外,由于变量保持在范围内直到循环退出,所以绝对没有理由"删除"(=重新调整堆栈指针)它直到循环退出,我当然不希望代码的每次迭代有任何开销像这样.

此外,当然编译器可以自由地将分配完全"移出"循环,如果它感觉像是这样,使代码等同于你int x;之前的第二个例子while.重要的是,第一个版本更容易阅读和更强大的本地化,即对人类更好.