【发布时间】:2016-01-12 02:49:48
【问题描述】:
为了清晰起见,有时我会在代码中声明“一次性”变量。这会显着影响性能还是编译器可以对其进行优化?
例如,我倾向于这样做:
int minVal = long_arithmetic_expresion();
int maxVal = even_longer_expression();
for (int i = minVal; i < maxVal; i++)
{
// Do stuff not related to minVal or maxVal
}
double part1 = 4*sqrt(something)* ... // Very long thing
double part2 = 5*sqrt(something else)* ... // Very long thing
double interestingValue = part1 / part2; // This is the only interesting variable for later
而不是:
for (int i = long_arithmetic_expresion(); i < even_longer_expression(); i++)
{
// Do stuff not related to minVal or maxVal
}
double interestingValue = (4*sqrt(whatever)* ...) / (5*sqrt(something else)* ...);
这个 for 循环将包含在一个将被多次调用的函数中,因此在我的情况下,即使是很小的性能提升也是相关的。
注意:
正如很快指出的那样,even_longer_expression() 有可能在循环的每一步都被评估,这当然不好。 为了清楚起见,我的问题与声明一次性变量的事实有关。 我在循环之后添加了更多代码。我指的是变量 part1 和 part2 之类的情况。
【问题讨论】:
-
在您的示例中,仅应声明
int maxVal = even_longer_expression(); -
even_longer_expression()将在每次通过时都被评估,所以当然不把它放在那里是有意义的。 -
minVal和maxVal应该是const甚至constexpr如果可能的话。它不仅可以防止您意外更改它们的值,还可以提示编译器进行更多优化。 -
我认为您真正想要的示例是循环条件是大型算术表达式,不会随着迭代而改变。最好用这样一个例子来编辑问题。
标签: c++ performance readability variable-declaration