C++ C+中安全有效的类型双关+;

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

上面的代码不是真正的代码,但这基本上就是真正的代码所做的。我从g++那里得到一个警告,它违反了严格的别名,我用谷歌搜索了它,好了,我想修复它。我发现了这个问题,但除了使用
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);