c - 循环中的变量定义

标签 c loops

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

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/

相关文章:

python - 如何理解 Python 循环的 `else` 子句?

c++ - GetDIBits 并使用 X、Y 遍历像素

c - 在c中得到 "free(): invalid pointer"

c - 使用 gcc 编译 C 程序

java - 交换两个数组的值,创建另一个不重复的数组并从最高到最低排序

javascript - Jquery 无法访问循环外的数组

c - 如何有选择地将二维数组的列或行传递给函数?

c - c 中的平方和多线程

圆形数组实现

javascript - jQuery 迭代嵌套 html 列表