c++ 循环的条件是否在每次迭代中重新求值?[重复]

wnavrhmk  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(115)

此问题在此处已有答案

Is it good practice to buffer the results of functions before a loop?(6个答案)
In a "i < vector.size()" loop condition, is size() called each iteration?(10个答案)
2天前关闭。
我有一个循环,看起来像这样:

for (int i = 0; i < dim * dim; i++)

字符串
for循环中的条件是否在每个循环中都重新求值?
如果是这样的话,这样做会更有效率吗?

int dimSquare = dim * dim;
for (int i = 0; i < dimSquare; i++)

00jrzges

00jrzges1#

是的,从语义上讲,它将在每个循环中进行评估。在 * 某些情况下 *,编译器 * 可能 * 能够自动从循环中删除条件-但并不总是如此。特别是:

void foo(const struct rect *r) {
  for (int i = 0; i < r->width * r->height; i++) {
    quux();
  }
}

字符串
在这种情况下,编译器将无法将乘法移出去,因为它知道quux()修改了r
一般来说,通常只有局部变量才有资格将表达式提升出循环(假设你从来没有把他们的地址!)。虽然在某些情况下结构成员也是合格的,但有很多事情可能会导致编译器假设内存中的所有内容都已更改-例如,写入几乎任何指针,或调用几乎任何函数。因此,如果您在那里使用任何非局部变量,最好假设优化不会发生。
也就是说,一般来说,我只建议在以下情况下主动将潜在昂贵的代码移出条件:

  • 这样做不会影响可读性
  • 显然需要很长时间(例如,网络访问)
  • 或者出现在侧写的热点。
gtlvzcf8

gtlvzcf82#

一般来说,如果你在循环中改变了“dim”的值,那么每次都会重新计算它。但由于你的例子不是这样,一个好的编译器会优化你的代码,你不会看到任何性能上的差异。

bvn4nwqk

bvn4nwqk3#

编译器将在循环开始之前预先计算Dim * Dim的值

相关问题