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
或依赖未定义但实际上没有问题的行为(即访问联合的未设置成员)之外,它没有给出明确的解决方案。
目前我能想到的方案是,
- 使用
memcpy
.
- 使用
union
并将此部分编译为 C,其中语言标准允许通过联合进行类型双关。
按位运算定义明确,也许效率更高。对于此示例:
return seed ^ (seed >> 32);
uint32_t Seed() {
uint64_t seed = GetSomeReasonable64BitIntegerSeed();
return *(uint32_t*)&seed ^ *((uint32_t*)&seed + 1);
}
以上不是真正的代码,但这基本上是真正的代码所做的。我收到来自 g++ 的警告,它违反了严格的别名,用谷歌搜索了一下,好吧,我想修复它。我发现 this 问题,但除了使用 memcpy
或依赖未定义但实际上没有问题的行为(即访问联合的未设置成员)之外,它没有给出明确的解决方案。
目前我能想到的方案是,
- 使用
memcpy
. - 使用
union
并将此部分编译为 C,其中语言标准允许通过联合进行类型双关。
按位运算定义明确,也许效率更高。对于此示例:
return seed ^ (seed >> 32);