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.
对于第一个问题,我不确定为什么你不能只通过作业得到你想要的东西.编译器将执行可以执行的任何优化.
在您的第二个示例代码中.你违反了严格的别名.所以它不一样.
至于为什么它慢了:
这是因为今天的CPU往往有单独的整数和浮点单位.通过这样的类型惩罚,可以强制将值从一个单位移动到另一个单位.这有开销.(这通常通过内存完成,因此您有额外的负载和存储.)
在第二个片段中: a最初位于浮点单元(x87 FPU或SSE寄存器)中,需要移入通用寄存器以应用掩码0x7FFFFFFF.然后它需要被移回.
在第一个片段中:编译器可能足够智能,可以a直接加载到整数单元中.所以你在第一阶段绕过了FPU.
(在你向我们展示程序集之前,我不是百分之百确定.它还将在很大程度上取决于参数是在寄存器中还是在堆栈中启动.以及输出是否由另一个浮点操作立即使用.)