std :: copy_n和reinterpret_cast

时间:2012-10-24 16:05:31

标签: c++ copy 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 个答案:

答案 0 :(得分:4)

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

就像quid.data1被声明为uint data1[4]一样。结果是quid.data1被复制到out[0]并且out的其他3个元素变得垃圾。

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

data1的内容视为4个字符的数组,如果sizeof(uint)==4则可以使用。

答案 1 :(得分:4)

结果会有所不同,因为&x的类型为T *,其中Tx的类型,指针算术将+ 1视为“推进指针由sizeof(T)“组成,因此实际上您将指针视为指向该类型元素数组的指针。

如果更改指针的类型,您将把它指向的内存视为不同类型的元素数组 - 例如,将int视为{{1}的数组1}} S上。