Я использовал std::memcpy
чтобы долго обходить строгий псевдоним.
Например, досмотр float
, как это:
float f = ...;
uint32_t i;
static_assert(sizeof(f)==sizeof(i));
std::memcpy(&i, &f, sizeof(i));
// use i to extract f sign, exponent & significand
Однако, на этот раз, я проверил стандарт, я не нашел ничего, что подтвердило бы это. Все, что я нашел, это:
Для любого объекта (кроме потенциально перекрывающегося подобъекта) тривиально-скопируемого типа T, независимо от того, имеет ли объект допустимое значение типа T, базовые байты ([intro.memory]), составляющие объект, могут быть скопированы в массив char, unsigned char или std :: byte ([cstddef.syn]). 40 Если содержимое этого массива будет скопировано обратно в объект, объект впоследствии сохранит свое первоначальное значение. [ Пример:
#define N sizeof(T) char buf[N]; T obj; // obj initialized to its original value std::memcpy(buf, &obj, N); // between these two calls to std::memcpy, obj might be modified std::memcpy(&obj, buf, N); // at this point, each subobject of obj of scalar type holds its original value
- конец примера]
и это:
Для любого тривиально скопируемого типа T, если два указателя на T указывают на различные T-объекты obj1 и obj2, где ни obj1, ни obj2 не являются потенциально перекрывающимся подобъектом, если базовые байты ([intro.memory]), составляющие obj1, копируются в obj2, 41 obj2 впоследствии будет иметь то же значение, что и obj1. [ Пример:
T* t1p; T* t2p; // provided that t2p points to an initialized object ... std::memcpy(t1p, t2p, sizeof(T)); // at this point, every subobject of trivially copyable type in *t1p contains // the same value as the corresponding subobject in *t2p
- конец примера]
Таким образом, допускается std::memcpy
ing float
to/from char[]
, а также std::memcpy
между теми же тривиальными типами.
Является ли мой первый пример (и связанный ответ) четко определенным? Или правильный способ проверки float
- это std::memcpy
it в unsigned char[]
buffer и с помощью shift
и or
для сборки uint32_t
из него?
Примечание: просмотр std::memcpy
гарантирует, что этот вопрос не может ответить. Насколько я знаю, я мог бы заменить std::memcpy
на простой цикл байтов, и вопрос будет таким же.