为什么默认和空构造函数在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
相同的代码?
答
没有优化(-O0),gcc生成的代码可以很容易地调试,因此它包含源代码中的每个语句和函数调用。您可以在:: a上设置断点。有了更高的优化级别,您将看不到构造函数调用。
不同的代码如? – EJP
@EJP,他在链接中显示godbolt中的代码。 – prl
您正在编译是否进行优化?如果没有(例如'-O0')那就是原因。 – Peter