正在检查由编译器优化的循环中的复杂表达式?

时间:2017-08-31 19:04:06

标签: c loops optimization

(如果这是重复的,请指出我的答案)

我有两个场景,一个循环一遍又一遍地检查一个复杂的表达式(一个复杂的表达式将由数学运算和检索数据组成):

for (int i = 0; i < expression; i++) {
    // stuff
}

for (int i = 0; i < someNumber; i++) {
    if (i == expression) break;
}

我想知道预先计算表达式并检查已知值是否更有效

int known = expression;
for (int i = 0; i < known; i++) {
    // stuff
}

for (int i = 0; i < someNumber; i++) {
    if (i == known) break;
}

或者是否由编译器自动完成。

作为参考,我正在运行循环~7000000次,表达式类似于structure->arr[j] % nsqrt(a * n + b)

它甚至值得吗?

1 个答案:

答案 0 :(得分:3)

如果编译器能够检测到计算expression每次都会给出相同的结果,那么它只会进行一次计算。

棘手的部分是:“如果编译器能够......”

编译器非常聪明,在大多数情况下可能会成功。但为什么要冒这个机会呢?

只需在循环之前写下额外的行来进行计算,就像在第二个例子中那样。

通过这样做,您向编译器发送一条明确的消息,告知expression在循环中是否为常量。此外,它还可以帮助您的同事更容易理解代码。

那说......你自己必须确保expression每次都是一样的。让我们来看看你的例子:

  

表达式类似于structure-&gt; arr [i]%n或sqrt(a * n + b)

现在第一个,即structure->arr[i] % n取决于循环变量i,因此将代码移出循环将是大错误

第二个(即sqrt(a * n + b))看起来更好,只要a n b在循环内没有变化。