我可以创建一个带有传递给C++函数的形式参数的联合吗?

Vad*_*dim 2 c++ parameters function absolute-value unions

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

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

在函数中声明的union u保存变量x,它与在函数中作为参数传递的x不同.有没有办法用函数的参数创建一个联合 - x?

以上函数的任何原因与未注释的行执行的时间比这个更长?

__forceinline float fastAbs(float a)
{
    int b= *((int *)&a) & 0x7FFFFFFF;
    return *((float *)(&b));
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试找出尽可能少读取/写入内存的最佳方法来获取浮点值的Abs.

Mys*_*ial 5

对于第一个问题,我不确定为什么你不能只通过作业得到你想要的东西.编译器将执行可以执行的任何优化.

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

至于为什么它慢了:

这是因为今天的CPU往往有单独的整数和浮点单位.通过这样的类型惩罚,可以强制将值从一个单位移动到另一个单位.这有开销.(这通常通过内存完成,因此您有额外的负载和存储.)

在第二个片段中: a最初位于浮点单元(x87 FPU或SSE寄存器)中,需要移入通用寄存器以应用掩码0x7FFFFFFF.然后它需要被移回.

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

(在你向我们展示程序集之前,我不是百分之百确定.它还将在很大程度上取决于参数是在寄存器中还是在堆栈中启动.以及输出是否由另一个浮点操作立即使用.)