我认为初始化std::optionalwith与std::nullopt默认构造相同。
它们在cppreference中的描述与形式(1)相同。
但是,Clang和GCC似乎都不同地对待这些玩具示例函数。
#include <optional>
struct Data {
char large_data[0x10000];
};
std::optional<Data> nullopt_init() {
return std::nullopt;
}
std::optional<Data> default_init() {
return {};
}
Run Code Online (Sandbox Code Playgroud)
编译器资源管理器似乎暗示使用std::nullopt会简单地设置“ contains”标志,
nullopt_init():
mov BYTE PTR [rdi+65536], 0
mov rax, rdi
ret
Run Code Online (Sandbox Code Playgroud)
虽然默认构造将值初始化整个类。这在功能上是等效的,但几乎总是比较昂贵。
default_init():
sub rsp, 8
mov edx, 65537
xor esi, esi
call memset
add rsp, 8
ret
Run Code Online (Sandbox Code Playgroud)
这是故意行为吗?什么时候应该优先使用另一种形式?
默认构造函数std::chrono::duration定义如下:
constexpr duration() = default;
(例如,请参阅cppreference.com或libstdc ++源代码.)
但是,cppreference.com也谈到了constexpr构造函数:
constexpr构造函数必须满足以下要求:
...
必须在构造函数初始化列表中或通过成员大括号或相等的初始化程序初始化每个基类和每个非静态成员.另外,所涉及的每个构造函数都必须是constexpr构造函数,并且每个大括号或者相等的初始化程序的每个子句都必须是一个常量表达式
如果我对默认构造函数感到困惑,cppreference.com似乎说默认的构造函数与= default隐式构造函数的定义不同.
然而,rep(大多数)持续时间的类型是裸整数类型.所以,不应该将显式= default默认构造函数duration等效于
constexpr duration() {}
当然会保留duration::rep 未初始化类型的整数成员变量?而且,事实上,是不是标准的行为duration,使得缺省构造的值是未初始化?(但我找不到明确说明这一点的参考文献.)
在那么如何才能= default为构造duration是constexpr,如果离开一个非静态成员变量初始化?我错过了什么?