-2
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ですか?

4

2 に答える 2

4

&xhas type T *、ここでTは の型でありx、ポインター演算は+ 1「ポインターを進める」として扱うため、結果は異なります。sizeof(T)そのため、実際には、ポインターをその型の要素の配列へのポインターとして扱います。

ポインターの型を変更すると、ポインタが指しているメモリを別の型の要素の配列として扱うことになります。たとえば、anをs のint配列として扱います。char

于 2012-10-24T16:12:11.580 に答える
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);

の内容をdata14 文字の配列として扱いsizeof(uint)==4ます。

于 2012-10-24T16:10:45.687 に答える