C ++中安全高效的Punning类型

时间:2015-05-25 16:15:14

标签: c++ casting type-punning

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

上面不是真正的代码,但这基本上是真正的代码所做的。我从g ++那里得到一个警告,它违反了严格的别名,谷歌搜索它,好吧我想解决它。我发现了this问题,但除了使用memcpy或依赖于未定义但实际上没有问题的行为之外,它没有提供明确的解决方案,即访问联合的未设置成员。

我能想到的当前选择是,

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

1 个答案:

答案 0 :(得分:8)

逐位算术定义明确,可能更有效。对于这个例子:

return seed ^ (seed >> 32);