我只是想知道以下语句之间是否存在任何区别,就如何在没有任何优化的情况下在Clang编译器上编译和执行它们而言:
int x;
int y;
y = x = 5;
int x = 5;
int y = 5;
int x;
int y;
x = 5;
y = 5;
答案 0 :(得分:2)
我使用以下命令使用Clang编译了上述每个语句:
clang++ -S -mllvm --x86-asm-syntax=intel test.cpp
他们的装配完全相同:
.section __TEXT,__text,regular,pure_instructions
.globl _main
.align 4, 0x90
_main: ## @main
.cfi_startproc
## BB#0:
push rbp
Ltmp2:
.cfi_def_cfa_offset 16
Ltmp3:
.cfi_offset rbp, -16
mov rbp, rsp
Ltmp4:
.cfi_def_cfa_register rbp
mov eax, 0
mov dword ptr [rbp - 4], 0
mov dword ptr [rbp - 8], 0
mov dword ptr [rbp - 12], 0
pop rbp
ret
.cfi_endproc
.subsections_via_symbols
这并不意味着所有编译器/语言都是如此,它也没有说明Clang如何处理这三个语句中的每一个。即,它是否能更快地编译任何特定的代码片段?
答案 1 :(得分:1)
应该没有区别,因为任何体面的编译器都会将声明与初始化相结合。话虽如此,它完全取决于编译器为每种情况实现的内容。
答案 2 :(得分:0)
就优化而言,内置类型的这些语句没有区别。但对于用户定义的类型,它很重要。 让我们说我有课程" Compiler"。
Compiler c = c1; // 1)
Compiler c; // 2)
c = c2.
在1中,将有一个类复制构造函数的调用,而在第二种情况下,首先会有两个调用默认构造函数,第二个调用赋值运算符。 这种情况也适用于内置类型,但尺寸太小而无法在优化方面产生任何差异。