gpt4 book ai didi

c++ - 对 C++ 中的类型双关有何看法?

转载 作者:IT老高 更新时间:2023-10-28 21:42:58 32 4
gpt4 key购买 nike

我很好奇 C++ 中类型双关语指针/数组的约定。这是我目前的用例:

Compute a simple 32-bit checksum over a binary blob of data by treating it as an array of 32-bit integers (we know its total length is a multiple of 4), and then summing up all values and ignoring overflow.

我希望这样的函数看起来像这样:

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 类型转换?

union {
const uint32_t *udata;
const char *cdata;
};
cdata = data;
// now use udata

我完全意识到这不是一个 100% 可移植的解决方案,但我只希望在我知道它可以工作的一小部分平台上使用它(即未对齐的内存访问和编译器对指针别名的假设)。你会推荐什么?

最佳答案

就 C++ 标准而言,litb的答案是完全正确的,也是最便携的。将 const char *data 转换为 const uint3_t *,无论是通过 C 风格转换、static_cast 还是 reinterpret_cast,打破了严格的别名规则(见 Understanding Strict Aliasing)。如果您在完全优化的情况下进行编译,那么代码很可能不会做正确的事情。

通过 union 进行强制转换(例如 litb 的 my_reint)可能是最好的解决方案,尽管它在技术上确实违反了这样的规则,即如果您通过一个成员写入 union 并通过另一个成员读取它,它导致未定义的行为。然而,几乎所有的编译器都支持这一点,它会产生预期的结果。如果您绝对希望 100% 符合标准,请使用位移方法。否则,我建议通过 union 进行强制转换,这可能会给您带来更好的性能。

关于c++ - 对 C++ 中的类型双关有何看法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/346622/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com