我对 C++ 中类型双关语指针/数组的约定很好奇。这是我目前的用例:
通过将二进制数据块视为 32 位整数数组(我们知道它的总长度是 4 的倍数),然后对所有值求和并忽略溢出,计算一个简单的 32 位校验和。
我希望这样的函数看起来像这样:
uint32_t compute_checksum(const char *data, size_t size)
{
const uint32_t *udata = /* ??? */;
uint32_t checksum = 0;
for (size_t i = 0; i != size / 4; ++i)
checksum += udata[i];
return udata;
}
现在我的问题是,您认为转换data
为的“最佳”方式是udata
什么?
C风格的演员?
udata = (const uint32_t *)data
假设所有指针都是可转换的 C++ 强制转换?
udata = reinterpret_cast<const uint32_t *>(data)
C++ 在任意指针类型之间使用中间转换void*
?
udata = static_cast<const uint32_t *>(static_cast<const void *>(data))
通过工会铸造?
union {
const uint32_t *udata;
const char *cdata;
};
cdata = data;
// now use udata
我完全意识到这不是一个 100% 可移植的解决方案,但我只希望在我知道它可以工作的一小部分平台上使用它(即未对齐的内存访问和编译器对指针别名的假设)。你会推荐什么?