如果默认构造函数完全相同,它是否比 C++11 中的用户定义更好?
Is default constructor is better than user defined in C++11 if it's exactly the same?
如果我们提供完全相同的构造函数,编译器生成的构造函数如何比我们提供的构造函数更高效?
即,编译器是否在其默认构造函数中添加了任何额外的代码,从而降低了提供我们自己的用户定义构造函数的效率?
简单地说,默认构造函数是如何在中生成的
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?
如果我们提供完全相同的构造函数,编译器生成的构造函数如何比我们提供的构造函数更高效?
事实并非如此,它们在合理的编译器中生成相同的代码。
但是,没有什么能强迫编译器生成完全相同的代码。只要可观察到的行为是相同的。。
即,编译器是否向其默认构造函数添加了任何额外的代码,从而降低了提供我们自己的用户定义构造函数的效率?
不,在合理的编译器中。
相关文章:
- 当程序预期根据用户输入再次循环时,它会导致分段错误:11
- =删除用户定义的成员功能,除了构造函数,分配运算符C 11
- C++11 用户定义的物理属性单位文本
- GCC C++11 对用户定义的常量和模板参数包的限制
- C 11:列表限制如何在用户定义的对象中分配值
- C++11中的所有STL都是用户可实现的吗
- C++11:是用户声明的默认复制构造函数
- C99 printf 格式化程序与 C++11 用户定义的文本
- 是C++11用户定义的文字,比普通类型转换慢
- 如何在 C++11 的用户自定义类模板中继承 std::vector 模板
- Clang 3.1 C++11 用户定义的文本将不起作用
- C++11用户定义的文字
- 如何将cin中的用户输入转换为C++11 std::array
- 从c++11中用户定义的文字返回std::数组
- 在c++11中使用用户定义的转换进行重载运算符推导
- c++11用户定义的字面量,与编译/执行二分法冲突
- 如何验证用户输入以匹配任何没有字符的字符串,如%,*,?在c++中11
- C++11 类型特征:算术用户类型
- c++ 11: bind std::sort用于用户定义的类型,然后使用该绑定作为ctor的参数
- 使用Microsoft Visual Studio 2013的C++11用户定义文字