' x = y = 0',' x = 0之间的区别是什么? y = 0;'和' int x = 0; int y = 0;'关于执行?

时间:2014-09-15 14:44:20

标签: c++ assembly clang

我只是想知道以下语句之间是否存在任何区别,就如何在没有任何优化的情况下在Clang编译器上编译和执行它们而言:

1

int x;
int y;
y = x = 5;

2

int x = 5;
int y = 5;

3

int x;
int y;
x = 5;
y = 5;

3 个答案:

答案 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中,将有一个类复制构造函数的调用,而在第二种情况下,首先会有两个调用默认构造函数,第二个调用赋值运算符。 这种情况也适用于内置类型,但尺寸太小而无法在优化方面产生任何差异。