在C++中应该避免变量声明吗?
有时候为了清晰起见,我在代码中声明了“一次使用”变量。这是否会显着影响性能或者编译器是否可以优化它?在C++中应该避免变量声明吗?
例如,我会倾向于做:
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。
这是否会对性能产生显着影响,或者编译器是否可以对其进行优化?
完全取决于:
如果long_arithmetic_expresion()
和even_longer_expression()
被标记为constexpr
,并不太可能在运行时改变,编译器可以优化了重复这些函数的调用。
否则,最好使用一次初始化的变量。
另外,将'maxVal'设为'const'。那么,这也是传统上用迭代器结束时看到的风格。它可以轻松避免重复评估'for'循环的每次迭代。 – B98
@ B98简而言之,这是否意味着在声明额外的变量时没有性能损失,如果它们是'const',但是如果它们不是'const',避免额外的声明可能会更好? – frischkase
@frischkase取决于编译器和开关,但是我认为'const'可能会增加触发优化的机会,而不是声明一个变量并将许多代码集中在一起,而是看起来过早的优化。如果需要的话,只有目标代码会显示实际的需求,但是今天的优化器确实遵循流程和优化.-'const'和一个变量都引入*名称*,可以表达意图或者简写const添加常量意义。我认为在这种情况下,绩效不是主要问题,逻辑和风格可能是。 – B98
除非你禁用优化,下面的代码几乎肯定会显示出绝对的现代编译器相同的性能(因为表现明显独立):
// save to temporary minVal variable
int minVal = long_arithmetic_expresion();
int maxVal = even_longer_expression();
for (int i = minVal; i < maxVal; i++) {
...
}
// avoid creating temporary minVal variable
int maxVal = even_longer_expression();
for (int i = long_arithmetic_expresion(); i < maxVal; i++) {
...
}
但第一个版本是往往更具可读性=)
原因是:copy propagation对于基本类型的变量而言对于编译器来说是微不足道的。所以在第一个版本中编译器会删除i = minVal
作业。
在你的例子中'int maxVal = even_longer_expression();'只应该被声明 – Evgeny
'even_longer_expression()'将会被每次通过评估,所以当然不需要在那里进行评估。 –
如果可能,'minVal'和'maxVal'应该是'const'或者甚至'constexpr'。它不仅可以防止您意外更改其值,还可以提示编译器进行更多优化。 –