Я думал, что инициализация 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
Это преднамеренное поведение? Когда одна форма должна быть предпочтительнее другой?