我一直在努力养成在需要时定义琐碎变量的习惯。我一直对编写这样的代码持谨慎态度:
while (n < 10000) {
int x = foo();
[...]
}
我知道标准非常清楚 x
只存在于循环内,但这在技术上是否意味着每次迭代都会在堆栈上分配和释放整数?我意识到优化编译器不太可能做到这一点,但可以保证吗?
例如,这样写是不是更好:
int x;
while (n < 10000) {
x = foo();
[...]
}
我不是指具体的代码,而是指像这样的任何循环。
我用 gcc 4.7.2 对一个简单的循环进行了快速测试,但产生了相同的程序集,但我的问题是,根据标准,这两个真的是相同的吗?
最佳答案
请注意,像这样“分配”自动变量几乎是免费的;在大多数机器上,它要么是单指令堆栈指针调整,要么是编译器使用寄存器,在这种情况下无需执行任何操作。
此外,由于变量在循环退出之前一直保留在范围内,因此绝对没有理由在循环退出之前“删除”(=重新调整堆栈指针)它,我当然不希望有任何 像这样的代码的每次迭代开销。
此外,当然,编译器可以自由地将分配完全“移出”循环,如果感觉合适的话,使代码等同于你的第二个示例,在 int x;
之前同时
。重要的是第一个版本更易于阅读且本地化程度更高,即更适合人类。
关于c - 循环中的变量定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15410208/