C++中bool值的逻辑"或"效率

Ant*_*ndo 3 c++ boolean bitwise-operators

bool x = false, y = false, z = true;

if(x || y || z){}

or

if(x | y | z){}
Run Code Online (Sandbox Code Playgroud)

第二个if语句是否对所有布尔值执行了一些"或"操作?把它们视为有字节吗?ex)(0000 | 0000 | 0001)=真......

或者它是否像Java一样 在布尔值上,它会评估表达式中的每一个bool,即使第一个是真的吗?

我想知道位运算符如何处理bool值.它等于整数按位运算?

A. *_* H. 8

效率取决于,逻辑或运算符||是短路运算符,意味着如果x在您的示例中它是真的,它将不会评估yz.如果它是合乎逻辑的,&&那么如果x是假的,它将不会测试yz.重要的是要注意,此操作不作为指令存在,因此这意味着您必须使用测试和跳转指令.这意味着分支,这会减慢事情的速度.由于现代CPU是流水线的.

但真正的答案是,它与许多其他这类性质的问题一样,因为有时短路操作的好处超过了成本.

在下面非常简单的示例中,您可以看到按位或|更高级.

#include <iostream>


bool test1(bool a, bool b, bool c)
{
    return a | b | c;
}

bool test2(bool a, bool b, bool c)
{
    return a || b || c;
}

int main()
{
  bool a = true;
  bool b = false;
  bool c = true;
  test1(a,b,c);
  test2(a,b,c);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

以下是gcc-4.8生成的intel样式汇编列表-O3:
test1assembly:

_Z5test1bbb:
.LFB1264:
    .cfi_startproc
    mov eax, edx
    or  eax, esi
    or  eax, edi
    ret
    .cfi_endproc
Run Code Online (Sandbox Code Playgroud)

test2 部件 :

_Z5test2bbb:
.LFB1265:
    .cfi_startproc
    test    dil, dil
    jne .L6
    test    sil, sil
    mov eax, edx
    jne .L6
    rep; ret
    .p2align 4,,10
    .p2align 3
.L6:
    mov eax, 1
    ret
    .cfi_endproc
Run Code Online (Sandbox Code Playgroud)

你可以看到它有分支指令,这会弄乱管道.

然而,有时候短路是值得的

return x && deep_recursion_function();

免责声明:

我总是会使用逻辑运算符bools.除非表现确实很关键,也许简单的情况下,像在test1test2,但有很多的bool的.在任何一种情况下,首先要确认你确实得到了改进.