为什么默认和空构造函数在C++中生成不同的机器代码?

问题描述:

当查看x86-64asm generated by GCC 7.1以下代码时,我发现a的构造函数生成代码,而b没有构造函数的标签。为什么默认和空构造函数在C++中生成不同的机器代码?

class a { 
public: 
    int aint; 

    a() { } 
}; 

class b { 
public: 
    int bint; 

    b() = default; 
}; 

int main() { 
    a ac; 
    //   lea  rax, [rbp-4] 
    //   mov  rdi, rax 
    //   call a::a() 
    ac.aint = 2; 
    //   mov  DWORD PTR [rbp-4], 2 


    b bc;    // no instructions for this statement 
    bc.bint = 5; 
    //   mov  DWORD PTR [rbp-8], 5 

    return 0; 
} 

为什么这里为构造函数生成的代码会如此不同? a() { }为什么不会生成与b() = default相同的代码?

+0

不同的代码如? – EJP

+0

@EJP,他在链接中显示godbolt中的代码。 – prl

+2

您正在编译是否进行优化?如果没有(例如'-O0')那就是原因。 – Peter

没有优化(-O0),gcc生成的代码可以很容易地调试,因此它包含源代码中的每个语句和函数调用。您可以在:: a上设置断点。有了更高的优化级别,您将看不到构造函数调用。