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

Jac*_*ach 0 c++ x86 gcc code-generation

当查看GCC 7.1为以下代码生成x86-64asm时,我发现a生成代码的构造函数虽然b没有构造函数的标签.

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;
} 
Run Code Online (Sandbox Code Playgroud)

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

prl*_*prl 5

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