gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:04:49 24 4
gpt4 key购买 nike

是否有一种在 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++,因为 union 体一次只能有一个成员处于“事件”状态。针对 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 函数的调用。他们还可以自由地插入 100 万个 NOOP,一个乒乓模拟 AI 训练类(class),并尝试搜索戈德布莱克猜想证明的证明空间。

在某些时候,您必须假设您的编译器没有敌意。

每个像样的编译器都了解 memcpy 的作用。

关于c++ - 跨 C 和 C++ 标准的可靠类型双关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58674606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com