C++中是否应始终避免变量声明

Should variable declarations always be avoided in C++?

本文关键字:变量 声明 是否 C++      更新时间:2023-10-16

为了清晰起见,有时我会在代码中声明"一次性"变量。这会显著影响性能吗?或者编译器可以对其进行优化吗?

例如,我倾向于这样做:

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_langer_expression()进行求值,这当然是不好的。为了清楚起见,我的问题与声明一个使用变量的事实有关。我在循环之后添加了更多的代码。我指的是变量第1部分的第2部分

这会显著影响性能吗?或者编译器可以对其进行优化吗?

完全取决于:

如果long_arithmetic_expresion()even_longer_expression()标记为constexpr,并且在运行时不太可能更改,则编译器可以优化对这些函数的重复调用。

否则,最好使用一次初始化的变量。

除非禁用优化,否则以下代码在现代编译器上几乎肯定会显示出完全相同的性能(考虑到表达式显然是独立的):

// 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++) {
    ...
}

但第一个版本通常更可读=)

原因是:对于编译器来说,基本类型变量的复制传播是微不足道的。因此,在第一个版本中,编译器将删除i = minVal赋值。