操作if(!is_active)是否比if(is_active == false)更快?

时间:2013-05-06 08:37:58

标签: c++

我在2次操作之间混淆:

if(!is_active)
{
  do something here...
}

if(is_active == false)
{
  do something here...
}

哪个比另一个快? 如果速度更快,那为什么它更快。你能用0和1来解释位运算符。

8 个答案:

答案 0 :(得分:8)

编译时,它们将生成相同的机器代码。这只是语法问题。

从标准(5.3.1):

  

逻辑否定运算符的操作数!被隐式转换   bool(第4条);如果转换的操作数是,则其值为true   否则是假的。结果的类型是bool。

答案 1 :(得分:4)

两者都是等价的。您可以使用-S选项自行测试,该选项会将汇编程序输出生成file.s。使用amd64上的gcc,你可以得到例如

file.cpp:

void f()
{
    bool is_active = false;
    if(!is_active) { dosomething(); }

    if(is_active == false) { dosomething(); }
}

file.s:

...
    movzbl  -1(%rbp), %eax
    xorl    $1, %eax
    testb   %al, %al
    je  .L3
    call    _Z11dosomethingv
.L3:
    movzbl  -1(%rbp), %eax
    xorl    $1, %eax
    testb   %al, %al
    je  .L2
    call    _Z11dosomethingv
.L2:
...

您可以很容易地看到两个实例的代码相同。

更新以查看Charles Bailey的评论,包括编译器优化-O2

file.cpp:

extern bool is_active;

void f()
{
    if(!is_active) { dosomething(); }
}

void g()
{
    if(is_active == false) { dosomething(); }
}

file.s:

    cmpb    $0, is_active(%rip)
    je    .L4
    rep
    ret
    .p2align 4,,10
    .p2align 3
.L4:
    jmp    _Z11dosomethingv
...
    cmpb    $0, is_active(%rip)
    je    .L7
    rep
    ret
    .p2align 4,,10
    .p2align 3
.L7:
    jmp    _Z11dosomethingv

这次生成的汇编程序代码不同,但正如预期的那样,if两个语句都是相同的。

答案 2 :(得分:0)

当你的编译器没有将它优化为exaclty时,你有一个非常愚蠢的编译器。

但如果其中一个更快,那么if(!is_active),因为它只需要一个ASM INV命令而不是LOADCMP

答案 3 :(得分:0)

没有比尝试自己更简单的方法了:)编写简单的程序,使用两者并测量时间。我认为,它可以是编译器和特定的最优化。

然而......试图优化这段代码是没用的......你专注于错误的优化:)

答案 4 :(得分:0)

未经优化,第一个是否定,然后是零比较;第二个是比较,然后是零比较。

优化它们几乎肯定是一样的。

答案 5 :(得分:0)

这个问题的答案在很大程度上取决于编译器理解代码的能力 - 编译模板。 基本上,你问的是同一个二元问题 - 变量is_active等于0;但你用两种不同的方式问它:

  1. 等于固定值0
  2. 是0
  3. 以外的任何东西

    智能编译器(以及支持程序集ISA)不会执行逻辑not,然后比较为0,而是首先将它与不等于0的值进行比较。

    总而言之,假设您的编译器甚至是半智能的,并且ISA支持比较不是0的值;它应该是完全相同的

答案 6 :(得分:0)

我建议你永远不要使用

if ( is_active == false )

相反,您可以使用:

if ( false == is_active )if ( !is_active )

但不是出于效率原因。

初学者的一个常见错误是将==写为=。 (有时我也有这样的错字)。在前一种情况下,这种错误会导致合法的转让。在后者中,编译器会抱怨错误,因为您永远不能将任何内容分配给false

希望这也有助于:)

答案 7 :(得分:-1)

这样编写是一种不好的做法:

if(is_active == false)

不要这样做。

关于此类操作的速度......我们在2013年。; - )