Разрешить различным фундаментальным типам совместно использовать одну и ту же область памяти, используя std::bit_cast вмC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Разрешить различным фундаментальным типам совместно использовать одну и ту же область памяти, используя std::bit_cast вм

Сообщение Anonymous »

Можно хранить целые числа или числа с плавающей запятой в одной и той же ячейке памяти, используя std::bit_cast (включая целые числа размером более 2^24, т. е. они не могут храниться как целые числа в числах с плавающей запятой, поскольку мантисса имеет слишком мало битов). Пример:

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

float storage = 0.0f;

//store a very large int using the underlying bits in a float:
storage = std::bit_cast(2'147'483'647);

//retrieve the int:
int int_val = std::bit_cast(storage);

//whenever you decide that you'd rather store a float than an int,
//you can simply overwrite the variable with whatever float value
//you want (analogous to an untagged / non-discriminated union)
У меня есть ряд вопросов по этому поводу:

[*]Опирается ли это на неопределенное поведение?[*]Может ли это привести к сбою в определенных системах из-за различий в формате с плавающей запятой, порядке байтов или по другим причинам?
[*]Могут ли определенные битовые комбинации считаться бессмысленными для чисел с плавающей запятой и не могут быть побитовое преобразование или сохранение правильно?
[*]Может ли этот метод быть расширен для совместного использования ячеек памяти для других 4-байтовых или 8-байтовых типов?
[*]Каковы преимущества и недостатки этого метода по сравнению с std::variant или Union?


Подробнее здесь: https://stackoverflow.com/questions/793 ... n-by-using
Ответить

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

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

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

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

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