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

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

Сообщение Anonymous »

Я думал, что инициализация std::optional с помощью std::nullopt будет такой же, как и конструкция по умолчанию.
Они описаны как эквивалент в cppreference, как форма (1)
Однако и 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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