阿里云网站空间,cms管理什么意思,做物流有哪些网站,免费制作logo的软件有哪些C语言关于与运算符
我们知道#xff0c;在很多场景中和通常可以相互代替#xff0c;那么它们到底有什么不同呢#xff1f;
先看一段代码
bool a, b, c;
c a b;使用clang -S编译出来的指令如下#xff1a; movb -5(%rbp), %al …C语言关于与运算符
我们知道在很多场景中和通常可以相互代替那么它们到底有什么不同呢
先看一段代码
bool a, b, c;
c a b;使用clang -S编译出来的指令如下 movb -5(%rbp), %al # aandb $1, %almovzbl %al, %eaxmovb -6(%rbp), %cl # bandb $1, %clmovzbl %cl, %ecxandl %ecx, %eax # a bcmpl $0, %eaxsetne %alandb $1, %al movb %al, -7(%rbp) # c使用clang -S -O3编译出来的指令如下 movzbl -1(%rbp), %edxandb -2(%rbp), %dl再看一段代码
bool a, b, c;
c a b;其汇编代码为 xorl %eax, %eaxtestb $1, -5(%rbp) # amovb %al, -8(%rbp) je .LBB2_2
# %bb.1:movb -6(%rbp), %al # bmovb %al, -8(%rbp)
.LBB2_2:movb -8(%rbp), %al andb $1, %almovb %al, -7(%rbp) # c反汇编一下
tmp a;
if(a1) {tmp b;
}
c tmp 1;通过对比两段汇编代码就很清晰了运算在底层表现为一条指令and而运算实际上需要通过分支的方式实现。
那么能否说明的效率比要高呢不一定
我们知道是与运算例如要得到a b的值就必须分别求得a和b的值。但是通过分支的方式实现要想得到a b的值其实不必都求出a和b的值如果先求出a的值是0那么就不必再求b了。
再看一段代码
bool funcA() {}bool funcB() {}int main () {bool c funcA() funcB();bool d funcA() funcB();
}上述代码中表达式funcA() funcB() 与 funcA() funcB() 哪一个效率更高
需要具体分析funcA()和funcB()的返回值分布与复杂度如果funcA()和funcB()复杂度很低并且大部分情况下返回1那么funcA() funcB()的效率可能会高些如果funcA()和funcB()复杂度较高并且有可能返回0那么funcA() funcB()会高一些。
另外值得一提的是funcA() funcB()与funcB() funcA()哪个效率高
返回0概率复杂性(耗时)funcA()a_pza_costfuncB()b_pzb_cost
funcA() funcB() 期望耗时为:
a_cost (1-a_pz) * b_cost
funcB() funcA() 期望耗时为:
b_cost (1-b_pz) * a_cost
举个例子
返回0概率复杂性(耗时)funcA()0.950funcB()0.840
funcA() funcB() 期望耗时为54 funcB() funcA() 期望耗时为50