在空间和时间利用的数量和效率方面,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的副本,我认为这是不正确的,因为
请查看此问题的标志。这不是重复。
答案 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
获取数百个转储文件,说明发生了哪些优化(但您将花费数天研究它们)。