reinterpret_cast
是否安全,这是最好的方法吗?
例如,在下面的代码中,我有一个名为ibytestream
的类,它允许从中读取uint16_t
和int16_t
s。 ibytestream::next
是vector<unsigned char>::iterator
。
inline ibytestream& operator>>(ibytestream& stream, uint16_t& data) {
data = 0;
data |= *stream.next++;
data <<= 8;
data |= *stream.next++;
return stream;
}
inline ibytestream& operator>>(ibytestream& stream, int16_t& data) {
return stream >> reinterpret_cast<uint16_t&>(data);
}
我不想复制用于将字节转换为整数的代码,因此我使用reinterpret_cast
作为签名版本来重用未签名版本的代码。它在我的机器上工作正常,但它会在其他现代机器上运行吗?
答案 0 :(得分:3)
是的,这是安全的。
标准的三个部分适用于做出此决定:
对于每个标准有符号整数类型,存在相应的(但不同的)标准无符号整数类型:
unsigned char
,unsigned short int
,unsigned int
,unsigned long int
, 和unsigned long long int
,每个占用相同的存储空间并具有相同的对齐要求。可以将对象指针显式转换为不同类型的对象指针。将“指向T1的指针”类型的prvalue转换为“指向T2的指针”类型(其中T1和T2是对象类型,T2的对齐要求不比T1更严格)并返回其原始类型会产生原始类型指针值。
如果使用reinterpret_cast可以将“指向T1的指针”类型的表达式显式转换为“指向T2的指针”类型,则可以将类型T1的glvalue表达式强制转换为“对T2的引用”。结果是指 与源glvalue相同的对象,但具有指定的类型。
答案 1 :(得分:1)
是的,这应该是完全没问题的。 (在int和字节数组之间移动有潜在的字符串问题,但这是另一个适用于有符号和无符号数字的问题。)
完全不同的东西:这一点:
data = 0;
data |= *stream.next++;
...可以简化:
data = *stream.next++;