C中bool值的逻辑“或”效率
发布时间:2020-12-16 10:25:03 所属栏目:百科 来源:网络整理
导读:bool x = false,y = false,z = true;if(x || y || z){}orif(x | y | z){} 第二个if语句是否对所有布尔值执行了一些“或”操作?把它们视为有字节吗? ex)(0000 | 0000 | 0001)=真…… 或者它是否像Java一样在布尔值上,它会评估表达式中的每一个bool,即使第一
bool x = false,y = false,z = true; if(x || y || z){} or if(x | y | z){} 第二个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 c) { return a || b || c; } int main() { bool a = true; bool b = false; bool c = true; test1(a,b,c); test2(a,c); return 0; } 以下是gcc-4.8使用-O3生成的intel样式汇编列表: _Z5test1bbb: .LFB1264: .cfi_startproc mov eax,edx or eax,esi or eax,edi ret .cfi_endproc 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 你可以看到它有分支指令,这会弄乱管道. 然而,有时候短路是值得的 返回x&& deep_recursion_function(); 免责声明: 我总是在bools上使用逻辑运算符.除非性能真的很关键,否则可能是简单的情况,例如test1和test2,但有大量的bool.在任何一种情况下,首先要确认你确实得到了改进. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |