【问题标题】:Safe and Efficient Type Punning in C++C++ 中安全高效的类型双关语
【发布时间】:2015-05-25 16:15:13
【问题描述】:
uint32_t Seed() {
    uint64_t seed = GetSomeReasonable64BitIntegerSeed();
    return *(uint32_t*)&seed ^ *((uint32_t*)&seed + 1);
}

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

目前我能想到的选项是,

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

【问题讨论】:

  • 安全类型双关语可以使用std::bit_cast 完成。但这实际上是一个 XY 问题,根本不需要类型双关

标签: c++ casting type-punning


【解决方案1】:

按位算术定义良好,并且可能更有效。对于这个例子:

return seed ^ (seed >> 32);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-25
    • 2011-09-16
    • 2012-03-24
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多