C++ 中安全高效的类型双关

Safe and Efficient Type Punning in C++

uint32_t Seed() {
    uint64_t seed = GetSomeReasonable64BitIntegerSeed();
    return *(uint32_t*)&seed ^ *((uint32_t*)&seed + 1);
}

以上不是真正的代码,但这基本上是真正的代码所做的。我收到来自 g++ 的警告,它违反了严格的别名,用谷歌搜索了一下,好吧,我想修复它。我发现 this 问题,但除了使用 memcpy 或依赖未定义但实际上没有问题的行为(即访问联合的未设置成员)之外,它没有给出明确的解决方案。

目前我能想到的方案是,

  1. 使用memcpy.
  2. 使用 union 并将此部分编译为 C,其中语言标准允许通过联合进行类型双关。

按位运算定义明确,也许效率更高。对于此示例:

return seed ^ (seed >> 32);