有时为了清楚起见,我在代码中声明了“一次使用”变量 . 这是否会显着影响性能,还是编译器可以对其进行优化?
例如,我倾向于:
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循环将包含在一个将被多次调用的函数中,因此即使很小的性能增益也与我的情况相关 .
Note:
正如很快指出的那样,有可能在循环的每一步都可以评估even_longer_expression(),这当然不是好事 . 为清楚起见,我的问题涉及声明一次性变量的事实 . 我在循环后添加了一些代码 . 我指的是像变量part1和part2这样的情况 .
2 回答
完全取决于:
如果
long_arithmetic_expresion()
和even_longer_expression()
标记为constexpr
且在运行时不太可能更改,则编译器可以优化对这些函数的重复调用 .否则,最好使用一次初始化的变量 .
除非您禁用优化,否则以下代码几乎肯定会在现代编译器上显示完全相同的性能(假设表达式显然是独立的):
但是第一个版本通常更具可读性=)
原因是:对于编译器来说,copy propagation对于基本类型的变量来说是微不足道的 . 所以在第一个版本中编译器将删除
i = minVal
赋值 .