(如果这是重复的,请指出我的答案)
我有两个场景,一个循环一遍又一遍地检查一个复杂的表达式(一个复杂的表达式将由数学运算和检索数据组成):
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] % n
或sqrt(a * n + b)
它甚至值得吗?
答案 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
在循环内没有变化。