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

Why do the default and empty constructor generate different machine code in C++?

在查看以下代码的 x86-64asm generated by GCC 7.1 时,我发现 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;
} 

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

在没有优化 (-O0) 的情况下,gcc 生成的代码易于调试,因此它包括源代码中的每个语句和函数调用。您可以在 a::a 上设置断点。使用任何更高的优化级别,您都不会看到该构造函数调用。