繁体   English   中英

跨 C 和 C++ 标准的可靠类型双关

[英]Reliable type-punning across C and C++ standards

有没有一种在 C 和 C++ 中都有效的双关语? 最好是低开销,并避免琐碎的预处理器黑客攻击。

在 C89 中,我知道我可以这样做:

unsigned int float_bits(float num) {
    return *(unsigned int *)#
}

然而,这违反了 C99 的严格别名规则。 所以像这样的东西在各种 C 标准中可能更便携:

unsigned int float_bits(float num) {
    union { float f; unsigned int i; } u;
    u.f = num;
    return u.i;
}

但我知道这不是有效的 C++,因为一次只有一个工会成员可以“活跃”。 C 和 C++ 给出的典型解决方案是这样的:

unsigned int float_bits(float num) {
    unsigned int i;
    memcpy(&i, &num, sizeof(int));
    return i;
}

但是,这依赖于编译器能够优化对 memcpy 的调用。 memcpy 是唯一可跨 C 和 C++ 标准移植的方法吗?

unsigned int float_bits(float num) {
  unsigned int i;
  memcpy(&i, &num, sizeof(int));
  return i;
}

除了将i更改为与num相同的字节之外,调用memcpy没有任何副作用。

确实,编译器可以在这里自由插入对库memcpy function 的调用。 他们还可以随意插入100万个NOOP,一个乒乓模拟AI训练session,并尝试寻找Goldblach猜想证明的证明空间。

在某些时候,您必须假设您的编译器不是敌对的。

每个体面的编译器都了解 memcpy 的作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM