std :: copy_n и reinterpret_cast

uint    data1;
ushort  data2;
ushort  data3;
uchar   data4[8];

std::uint8_t buff[16];
std::uint8_t* out = buff;

out = std::copy_n(reinterpret_cast<std::uint8_t*>(&quid.data1), 4, out);
out = std::copy_n(reinterpret_cast<std::uint8_t*>(&quid.data2), 2, out);
out = std::copy_n(reinterpret_cast<std::uint8_t*>(&quid.data3), 2, out);

std::copy_n(quid.data4, 8, out);

Почему результат будет в out будет другим, если я не буду использовать reinterpret_cast?

-2

Решение

Результат будет другим, потому что &x имеет тип T *, где T это тип xи указатель обрабатывает арифметику + 1 как «продвижение указателя по sizeof(T)msgstr «, так что в действительности вы рассматриваете указатель как указатель на массив элементов этого типа.

Если вы измените тип указателя, вы будете обрабатывать память, на которую он указывает, как массив элементов другого типа — например, обрабатывать int как массив chars.

4

Другие решения

std::copy_n(&quid.data1, 4, out);

работает как будто quid.data1 были объявлены как uint data1[4], Результатом является то, что quid.data1 копируется в out[0] и 3 других элемента out получить мусор.

std::copy_n(reinterpret_cast<std::uint8_t*>(&quid.data1), 4, out);

относится к содержанию data1 как массив из 4 символов, это будет работать, если sizeof(uint)==4,

4

По вопросам рекламы [email protected]