如果默认构造函数完全相同,它是否比 C++11 中的用户定义更好?

Is default constructor is better than user defined in C++11 if it's exactly the same?

本文关键字:C++11 用户 更好 定义 是否 构造函数 默认 如果      更新时间:2024-04-28

如果我们提供完全相同的构造函数,编译器生成的构造函数如何比我们提供的构造函数更高效?

即,编译器是否在其默认构造函数中添加了任何额外的代码,从而降低了提供我们自己的用户定义构造函数的效率?

简单地说,默认构造函数是如何在中生成的

struct widget
{
// default ctor generated
};

比这个提供的更有效率:

struct widget
{
widget(){} // user-defined but exactly the same
};

如果编写widget() = default;(仅在类主体中(,则生成的构造函数与生成的构造函数完全相同。

这两者有一个widget() {}没有的模糊属性:初始化这样一个类的值将初始化所有未初始化的字段。

示例:

struct A
{
int x;
int y = 1;
// This changes nothing:
// A() = default;
};
struct B
{
int x;
int y = 1;
B() {}
};
A a1;   // `x` is uninitialized    `y` is 1
A a2{}; // `x` is 0                `y` is 1
B b1;   // `x` is uninitialized    `y` is 1
B b2{}; // `x` is uninitialized    `y` is 1

如果您想利用两种不同的初始化策略,请仅使用widget() = default;或生成的构造函数,如果您没有未初始化的成员。

否则,请使用widget() {}来确保不会意外执行无用的初始化。

Libstdc++在其std::optional实现中陷入了这个陷阱,请参阅std::optional-construct empty with{}or std::nullopt?

如果我们提供完全相同的构造函数,编译器生成的构造函数如何比我们提供的构造函数更高效?

事实并非如此,它们在合理的编译器中生成相同的代码。

但是,没有什么能强迫编译器生成完全相同的代码。只要可观察到的行为是相同的。。

即,编译器是否向其默认构造函数添加了任何额外的代码,从而降低了提供我们自己的用户定义构造函数的效率?

不,在合理的编译器中。