我认为初始化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)
这是故意行为吗?什么时候应该优先使用另一种形式?