C++ C+中安全有效的类型双关+;
上面的代码不是真正的代码,但这基本上就是真正的代码所做的。我从g++那里得到一个警告,它违反了严格的别名,我用谷歌搜索了它,好了,我想修复它。我发现了这个问题,但除了使用C++ C+中安全有效的类型双关+;,c++,casting,type-punning,C++,Casting,Type Punning,上面的代码不是真正的代码,但这基本上就是真正的代码所做的。我从g++那里得到一个警告,它违反了严格的别名,我用谷歌搜索了它,好了,我想修复它。我发现了这个问题,但除了使用memcpy,或者依赖未定义但实际上没有问题的行为,即访问未设置的联盟成员之外,它并没有给出明确的解决方案 目前我能想到的选择是 使用memcpy 使用union并将此部分编译为C,其中语言标准允许通过union进行类型双关 位算术定义良好,可能更有效。对于此示例: uint32_t Seed() { uint64_t
memcpy
,或者依赖未定义但实际上没有问题的行为,即访问未设置的联盟成员之外,它并没有给出明确的解决方案
目前我能想到的选择是
memcpy
union
并将此部分编译为C,其中语言标准允许通过union进行类型双关位算术定义良好,可能更有效。对于此示例:
uint32_t Seed() {
uint64_t seed = GetSomeReasonable64BitIntegerSeed();
return *(uint32_t*)&seed ^ *((uint32_t*)&seed + 1);
}
安全型双关可以使用。但这实际上是一个XY问题,根本不需要类型双关
return seed ^ (seed >> 32);