在C中对两个变量进行逻辑或的最快方法,并将其存储在变量1中

时间:2018-07-18 23:03:26

标签: c optimization bitwise-operators logical-operators

考虑使用三种方法对两个_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当然是无风险的方法;但这也不是很优雅。

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

后两个应该更快。一些编译器可能更聪明地找出捷径。在这种情况下,性能不是由高级语言直接控制的,而是由编译器,设置,链接器,目标和周围的代码直接控制的,因此,基于您提供的内容,即使有更多信息,也可能没有正确的答案。由于基准通常很容易操纵,因此在基准中可以击败高绩效的答案。