gpt4 book ai didi

c++ - 我可以用传递给 C++ 函数的形式参数创建 union 吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:02:31 27 4
gpt4 key购买 nike

下面的函数计算 32 位浮点值的绝对值:

__forceinline static float Abs(float x)
{
union {
float x;
int a;
} u;
//u.x = x;
u.a &= 0x7FFFFFFF;
return u.x;
}

函数中声明的union u 持有变量x,它不同于函数中作为参数传递的x。有什么方法可以创建一个带有函数参数的 union - x?

上面带有未注释行的函数执行时间比这个函数长的原因是什么?

__forceinline float fastAbs(float a)
{
int b= *((int *)&a) & 0x7FFFFFFF;
return *((float *)(&b));
}

我正在尝试找出以尽可能少的内存读/写次数获取浮点值 Abs 的最佳方法。

最佳答案

对于第一个问题,我不确定为什么您不能随心所欲地分配作业。编译器会做任何可以做的优化。

在您的第二个示例代码中。你违反了严格的别名。所以这不一样。

至于为什么慢:

这是因为当今的 CPU 往往具有独立的整数和浮点单元。通过这样的类型双关,您可以强制将值从一个单元移动到另一个单元。这有开销。 (这通常是通过内存完成的,所以你有额外的加载和存储。)

在第二个片段中: a 原本在浮点单元(x87 FPU 或 SSE 寄存器)中,需要移动到通用中目的寄存器应用掩码 0x7FFFFFFF。然后需要将其移回。

在第一个片段中:编译器可能足够聪明,可以将 a 直接加载到整数单元中。所以你在第一阶段绕过了 FPU。

(在您向我们展示程序集之前,我不能 100% 确定。这在很大程度上还取决于参数是在寄存器中还是在堆栈中开始。以及输出是否立即被另一个浮点运算使用.)

关于c++ - 我可以用传递给 C++ 函数的形式参数创建 union 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7905468/

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