我在2次操作之间混淆:
if(!is_active)
{
do something here...
}
和
if(is_active == false)
{
do something here...
}
哪个比另一个快? 如果速度更快,那为什么它更快。你能用0和1来解释位运算符。
答案 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
命令而不是LOAD
和CMP
。
答案 3 :(得分:0)
没有比尝试自己更简单的方法了:)编写简单的程序,使用两者并测量时间。我认为,它可以是编译器和特定的最优化。
然而......试图优化这段代码是没用的......你专注于错误的优化:)
答案 4 :(得分:0)
未经优化,第一个是否定,然后是零比较;第二个是比较,然后是零比较。
优化它们几乎肯定是一样的。
答案 5 :(得分:0)
这个问题的答案在很大程度上取决于编译器理解代码的能力 - 编译模板。 基本上,你问的是同一个二元问题 - 变量is_active等于0;但你用两种不同的方式问它:
智能编译器(以及支持程序集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年。; - )