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值.它等于整数按位运算?
效率取决于,逻辑或运算符||
是短路运算符,意味着如果x
在您的示例中它是真的,它将不会评估y
或z
.如果它是合乎逻辑的,&&
那么如果x
是假的,它将不会测试y
或z
.重要的是要注意,此操作不作为指令存在,因此这意味着您必须使用测试和跳转指令.这意味着分支,这会减慢事情的速度.由于现代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
:
test1
assembly:
_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
.除非表现确实很关键,也许简单的情况下,像在test1
和test2
,但有很多的bool的.在任何一种情况下,首先要确认你确实得到了改进.
归档时间: |
|
查看次数: |
1493 次 |
最近记录: |