Я думал, что инициализация std::optional
с помощью std::nullopt
будет такой же, как и конструкция по умолчанию.
Они описываются так же, как и в, как форма (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 {};
}
Компилятор, похоже, подразумевает, что использование std::nullopt
просто установит флаг "содержит",
nullopt_init():
mov BYTE PTR [rdi+65536], 0
mov rax, rdi
ret
В то время как конструкция по умолчанию будет иметь значение инициализации всего класса. Это функционально эквивалентно, но почти всегда дороже.
default_init():
sub rsp, 8
mov edx, 65537
xor esi, esi
call memset
add rsp, 8
ret
Это преднамеренное поведение? Когда одна форма должна быть предпочтительнее другой?