首页 文章

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

提问于
浏览
2

有时为了清楚起见,我在代码中声明了“一次使用”变量 . 这是否会显着影响性能,还是编译器可以对其进行优化?

例如,我倾向于:

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 回答

  • 3

    这是否会显着影响性能,还是编译器可以对其进行优化?

    完全取决于:

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

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

  • 1

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

    // 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 赋值 .

相关问题