Std::optional — создать пустую фигурную скобку {} или std::nullopt?C++

Программы на C++. Форум разработчиков
Anonymous
Std::optional — создать пустую фигурную скобку {} или std::nullopt?

Сообщение Anonymous »

Я думал, что инициализация std::optional с помощью std::nullopt будет такой же, как и конструкция по умолчанию.
Они описаны как эквивалентные в cppreference, как перегрузки (1) и (2)
Однако и Clang, и GCC, похоже, обрабатывают эти игрушечные примеры функций по-другому.

Код: Выделить всё

#include 

struct Data { char large_data[0x10000]; };

std::optional nullopt_init()
{
return std::nullopt;
}

std::optional default_init()
{
return {};
}
Compiler Explorer, похоже, подразумевает, что использование std::nullopt просто установит один байт "

Код: Выделить всё

has_value
" флаг,

Код: Выделить всё

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

Обновление: GCC (начиная с версии 11.1) и Clang (начиная с версии 12.0.1) теперь эффективно обрабатывают обе формы.

Подробнее здесь: https://stackoverflow.com/questions/579 ... stdnullopt

Вернуться в «C++»