【问题标题】:Why do the default and empty constructor generate different machine code in C++?为什么默认构造函数和空构造函数在 C++ 中生成不同的机器码?
【发布时间】:2018-03-05 06:48:03
【问题描述】:

查看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 相同的代码?

【问题讨论】:

  • 不同代码如?
  • @EJP,他在链接中展示了godbolt中的代码。
  • 你是在编译还是不优化?如果没有(例如-O0),这就是原因。
  • @prl 他应该在这里展示它。不接受链接。

标签: c++ gcc x86 code-generation


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-10-16
    • 2016-12-16
    • 2020-05-14
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多