考虑使用三种方法对两个_Bool值A,B进行逻辑或运算,然后使用C编程语言将结果再次存储在A中,最快的是什么?
方式1:if (!A) A = B;
方式2:A = A || B;
方法3:A |= B;
当然,如果现在用一个复杂的语句替换B,则方法3将是最干净,最优雅的方法。
但是,我想一个普通的C编译器会以方式3无条件地计算B的值,即使A已经为真(意味着它不必计算B);因为这是按位操作,而不是逻辑操作。
那么方法2呢?编译器是否意识到在这种情况下不必计算B?
方法1当然是无风险的方法;但这也不是很优雅。
答案 0 :(得分:1)
您可以尝试一下。
#include <stdint.h>
_Bool one ( _Bool A, _Bool B )
{
if(!A) A = B;
return(A);
}
_Bool two ( _Bool A, _Bool B )
{
A = A || B;
return(A);
}
_Bool three ( _Bool A, _Bool B )
{
A |= B;
return(A);
}
一个特定的目标
00000000 <one>:
0: 2800 cmp r0, #0
2: bf08 it eq
4: 4608 moveq r0, r1
6: 4770 bx lr
00000008 <two>:
8: 4308 orrs r0, r1
a: 4770 bx lr
0000000c <three>:
c: 4308 orrs r0, r1
e: 4770 bx lr
后两个应该更快。一些编译器可能更聪明地找出捷径。在这种情况下,性能不是由高级语言直接控制的,而是由编译器,设置,链接器,目标和周围的代码直接控制的,因此,基于您提供的内容,即使有更多信息,也可能没有正确的答案。由于基准通常很容易操纵,因此在基准中可以击败高绩效的答案。