循环条件评估

时间:2009-08-07 00:01:31

标签: c++ optimization for-loop

只是一个简单的问题。

我有一个如下所示的循环:

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

是否在每个循环中重新评估for循环中的条件?

如果是这样,做这样的事情会更有效吗?:

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

由于

-Faken

3 个答案:

答案 0 :(得分:46)

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

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

在这种情况下,编译器将无法移出乘法,因为它知道quux()修改了r

一般情况下,通常只有局部变量才有资格从循环中提取表达式(假设你从不拿地址!)。虽然在某些条件下结构成员也可能符合条件,但有很多事情可能导致编译器假设内存中的所有内容都已更改 - 例如,写入几乎任何指针或调用几乎任何函数。因此,如果您在那里使用任何非本地人,最好假设不会发生优化。

这就是说,一般情况下,我只建议主动将潜在的昂贵代码移出条件,如果它是:

  • 这样做不会影响可读性
  • 显然需要非常很长时间(例如,网络访问)
  • 或者作为分析的热点出现。

答案 1 :(得分:36)

一般情况下,如果您要在循环中更改“dim”的值,则每次都会重新评估它。但是因为在你的例子中并非如此,一个不错的编译器会优化你的代码,你不会看到性能上的任何差异。

答案 2 :(得分:-4)

编译器将在Loop启动之前预先计算Dim * Dim的值