在 C 中逻辑或两个变量并在变量 1 中存储的最快方法



考虑使用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

后两者应该更快。有些编译器可能更聪明地找到捷径。在这种情况下,性能不直接由高级语言决定,而是由编译器、设置、链接器、目标及其周围的代码决定,因此,根据您提供的信息,没有正确的答案,即使有更多信息,高性能的答案也可能在基准测试中被击败,因为基准测试通常很容易操作。

相关内容

  • 没有找到相关文章

最新更新