0

I was wondering if one is inefficient over the other (two codes below)?

if ( abc & myType == myType ) 
{
    if (myValue)
    {
        // do something
    }
}

OR

if ( (abc & myType) && myValue ) 
{
    // do something
}
4

2 回答 2

4

其他一些人指出,由于这个原因,两者并不等同:

if (abc & myType == myType ) 
{
    if (myValue) {}
}

// OR

if ( (abc & myType) && myValue ) // missing myType == myType
{}

但是,还有第二个原因,两者不相等:==运算符的优先级高于&运算符(请参阅此链接)。因此,您的第一个表达式计算如下:

if (abc & myType == myType) // Evaluates to (abc & true)
{
    if (myValue) {}
}

您可能打算这样做:

if ((abc & myType) == myType) // Now the bitwise and happens before
                              // the comparison is made
{
    if (myValue) {}
}

为了避免这种错误,我总是使用括号来强制优先级,只要从人类的角度来看有任何歧义的可能性(即使编译器永远不会发现它有歧义),假设读者不知道什么是实际优先级是。这具有使代码更易于阅读的额外好处。

于 2013-03-13T03:19:56.660 回答
4

它们不相等,“更正”的第二个将是

if ( (abc & myType == myType) && myValue ) 
{
    // do something
}

在这种情况下,任何体面的编译器都会为两者发出相同的代码。

此外,进行这种微优化几乎是不明智的——您将时间浪费在最多只有一两条汇编指令的差异上,甚至可能在不重要的代码路径中。在这里,在性能没有真正差异的情况下,真正要做的优化是使您的代码更加清晰。

真正的优化是关心这些微小的差异(编译器可能已经考虑了这些差异),而是分析代码以找到真正的瓶颈。

于 2013-03-13T02:56:32.023 回答