https://godbolt.org/z/Efoj83hq1
По результатам "бенчмарка"(да он ужасен) вариант с bit_cast медленнее варианта с union, НО самое интересное, что вариант с обычным std::sqrt ещё быстрее(при том даже для double), Вопрос. Да что ж это такое то ? Как?
Вы понимаете, что ваше использование union является примером неопределённого поведения и не может сравниваться по производительности с корректным кодом? Потому что скорость не работающего кода не важна
ну во первых важна, потому что допустим я хочу максимально быстро считать корень из числа конкретно на этой платформе и конкретно прям сейчас, где это работает
Вы можете привести убедительную ссылку на документацию какой-либо платформы, которая даёт большие гарантии на платформе, чем стандарт языка C++? В таком случае вы должны понимать две вещи: 1) Вы больше не пишете на C++ 2) Вы используете семантически разные инструменты в сравнении производительности
кстати можно конкретику насчёт использования union, если даже такой примитивный вариант что то ломает, может вообще использование union - неопределенное поведение?
если ты трогаешь значение не из того типа который ты в посл раз клал то уб
Вы в своём простейшем примере используете union не по назначению. Вы не можете обращаться к его неактивному элементу. Присвоив значение x.i, вы не имеете права его читать через x.f
https://eel.is/c++draft/class.union#general-2.sentence-2 https://eel.is/c++draft/class.union#general-note-4
Да отстань ты
А как ещё написать optional в C++17?)
А зачем опшналу Юнион? Там же 1 хранимый тип
Расскажи свою концепцию внутреннего устройства optional без union
std::aligned_storage + bool
И конструкторы перестали быть constexpr
Это да, но до 20 плюсов
Я же уточнил про C++17
Кроме того, aligned_storage придется инициализировать конструктором по умолчанию (читай: затирать нулями), что может быть недешево
Обсуждают сегодня