[英]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.