只是一个简单的问题。
我有一个如下所示的循环:
for (int i = 0; i < dim * dim; i++)
是否在每个循环中重新评估for循环中的条件?
如果是这样,做这样的事情会更有效吗?:
int dimSquare = dim * dim;
for (int i = 0; i < dimSquare; i++)
由于
-Faken
答案 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的值