加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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样式汇编列表:
test1汇编:

_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.在任何一种情况下,首先要确认你确实得到了改进.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读