c – 根据条件然后三元运算符获得值的更快方法?

前端之家收集整理的这篇文章主要介绍了c – 根据条件然后三元运算符获得值的更快方法?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这就是我想要实现的目标.这很简单:
unsigned int foo1(bool cond,unsigned int num)
{
    return cond ? num : 0;
}

Assmebly:

test    dil,dil
    mov     eax,0
    cmovne  eax,esi
    ret

我的问题是,有更快的方法吗?以下是我想到的一些方法

使用乘法:

unsigned int foo2(bool cond,unsigned int num)
{
    return cond * num;
}

ASSMBLY:

movzx   eax,dil
    imul    eax,esi
    ret

使用内存访问:

unsigned int foo3(bool cond,unsigned int num)
{
    static const unsigned int masks[2] = { 0x0,0xFFFFFFFF };
    return masks[cond] & num;
}

部件:

movzx   edi,DWORD PTR foo3(bool,unsigned int)::masks[0+rdi*4]
    and     eax,esi
    ret

使用一些技巧:

unsigned int foo4(bool cond,unsigned int num) 
{
    return (0 - (unsigned)cond) & num;
}

部件:

movzx   eax,dil
    neg     eax
    and     eax,esi
    ret

现在,乘法产生最少的指令,我认为这是最好的选择,但我不确定imul.有什么建议?

提前致谢,

解决方法

乘法和内存访问比简单的if语句花费更多的时间.如果要优化此代码,最好的方法是仅使用“和”或“或”指令(将其设置为内联以避免函数调用).

这是使用蒙版而不是布尔值的函数的“优化”示例:

inline unsigned int foo1(unsigned int mask,unsigned int num)
{
  return mask & num;
}

你的电话会是这样的:

foo1(0,10);     /* Returns 0  */
foo1(~0,10);    /* Returns 10 */

猜你在找的C&C++相关文章