相关疑难解决方法(0)

为什么VS 2015编译器不能在浮点数的abs()实现中优化分支?

__declspec(dllexport)
float foo(float x) {
    return (x < 0) ? x * -1 : x;
}
Run Code Online (Sandbox Code Playgroud)

这是计算一个非常幼稚的做法abs(x),其中x一个float.我在发布模式下编译了这个并启用了我能找到的所有优化.结果asm是:

; 4    :    return (x < 0) ? x * -1 : x;

    movss   xmm1, DWORD PTR _x$[ebp]
    xorps   xmm0, xmm0
    comiss  xmm0, xmm1
    jbe SHORT $LN3@foo
    xorps   xmm1, DWORD PTR __xmm@80000000800000008000000080000000
$LN3@foo:
    movss   DWORD PTR tv66[ebp], xmm1
    fld DWORD PTR tv66[ebp]
Run Code Online (Sandbox Code Playgroud)

如您所见,这仍然包含分支和条件跳转.然而a float是由IEEE754定义的,因此我可以将实现更改为简单地将符号位设置为0:

__declspec(dllexport)
float foo(float x) {
    void* bar = &x;
    __int32 …
Run Code Online (Sandbox Code Playgroud)

c++ optimization assembly

3
推荐指数
1
解决办法
85
查看次数

如何使这个颜色百分比功能更快?C++

extern inline double getColorPercentage(uint8_t *pixel, uint8_t *pixel2) {
    //pixel 1 is 255, 255, 255
    //pixel 2 is 0, 0, 0
    //match is 0

    //pixel 1 and 2 is 255, 255, 255
    //match is 1.0
    return (255-fabs(pixel[2] - pixel2[2])) * (255-fabs(pixel[1] - pixel2[1])) * (255-fabs(pixel[0] - pixel2[0])) /16581375.0;
}
Run Code Online (Sandbox Code Playgroud)

我写了这个函数并试图优化它,并希望它可以进一步优化.我经常使用它,有人知道如何让它更高效吗?

c++ math optimization

2
推荐指数
1
解决办法
164
查看次数

标签 统计

c++ ×2

optimization ×2

assembly ×1

math ×1