考虑使用C编程语言对两个_Bool值A、B进行逻辑"或"运算并将结果再次存储在A中的三种方法,最快的是什么?
方式1:if (!A) A = B;
方式2:A = A || B;
方式3:A |= B;
当然,如果您现在用一个复杂的语句替换B,那么方法3将是最干净、最优雅的方法。
然而,我想一个普通的C编译器会无条件地用第3种方式计算B的值,即使a已经为真(这意味着它不必计算B(;因为这是按位操作,而不是逻辑操作。
那第二条路怎么样?编译器是否意识到在这种情况下不必计算B?
当然,方法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
后两者应该更快。有些编译器可能更聪明地找到捷径。在这种情况下,性能不直接由高级语言决定,而是由编译器、设置、链接器、目标及其周围的代码决定,因此,根据您提供的信息,没有正确的答案,即使有更多信息,高性能的答案也可能在基准测试中被击败,因为基准测试通常很容易操作。