变量初始化时是否重要?

时间:2015-12-08 09:03:01

标签: c++ initialization

在空间和时间利用的数量和效率方面,C ++之间是否存在差异?答案是否取决于编译器?

int main() {
    int a, b = 0;
    doSomething1(b);
    a = 9;
    doSomething2(a);
    return 0;
}
int main() {
    int a = 0, b = 0;
    doSomething1(b);
    a = 9;
    doSomething2(a);
    return 0;
}
int main() {
    int b = 0;
    doSomething1(b);
    int a = 9;
    doSomething2(a);
    return 0;
}

修改:此问题已被标记为this的副本,我认为这是不正确的,因为

  1. 另一个问题是询问变量 - 无论它们在函数中的位置 - 应该在一开始就声明,或者是否应该仅在使用它的代码块中声明它们(即最本地范围) )。
  2. 我的问题是询问是否存在性能差异,空间或时间方面,在函数的最开始时初始化变量,或仅在需要的时候在同一范围内
  3. 请查看此问题的标志。这不是重复。

1 个答案:

答案 0 :(得分:2)

原则上,任何符合C ++ 11标准的实现都应该显示等效的行为(以及#34;等同的"意味着很难掌握,这个棘手的概念是:{{3} })。

在实践中,我认为最好在声明(或接近)声明时初始化每个变量(如第二个例子)。代码可能更容易阅读,并将显示更多确定性行为。

使用最近的undefined behavior,在使用g++ -std=c++11 -Wall -Wextra -g进行编译时,您会收到有关未初始化变量的有用警告。

关于性能,当被问到GCC时(例如g++ -std=c++11 -O2),编译器将删除无用的初始化 - 特别是对于局部变量 - (因此始终初始化变量实际上不会影响生成代码的性能)。

  

我的问题是询问是否存在性能差异,空间或时间方面,在函数的最开始时初始化变量,或仅在相同范围内需要它时

可能没有实际差异的性能,但C ++ 11标准并不关心性能(更关心的是合规性)。性能是一个实施质量问题。

如果您非常关心性能,那么您需要基准。但请不要忘记在编译器中启用optimize (例如g++ -march=native -O2);我猜你不会注意到任何显着的性能差异(因此,如果你可靠地衡量一些差异,它可能只是一小部分的百分比)。

请查看生成的汇编程序代码(例如,使用g++ -S -fverbose-asm -O2,然后查看*.s生成的汇编程序文件。使用optimizations,您还可以通过-fdump-tree-all获取数百个转储文件,说明发生了哪些优化(但您将花费数天研究它们)。