假设出现这种情况,你有一个返回void的函数,该方法通常是if的唯一声明
if(condition)
someVoidMethod();
由于某些语言不会继续评估连接的布尔表达式,如果它们中的任何一个返回false。我们想知道将返回类型更改为int(或bool / boolean)并将其写为“
”意味着什么是优化?condition && someIntMethod();
没有任何转让。
我们理解程序员不应该专注于微观优化,但它实际上只是出于学术目的。
答案 0 :(得分:5)
编译器将为具有任何合理优化级别的两个备选方案生成相同的代码。两个语句背后的逻辑完全相同,因为&&
在C和C ++中产生分支行为以进行短路。
我使用两个程序验证了这一点:
计划1:
#include <stdio.h>
int foo() {printf("foo\n");}
int main() {
int i;
scanf("%d", &i); // Prevent from optimizing out the "if"
if (i) foo();
return 0;
}
计划2:
#include <stdio.h>
int foo() {printf("foo\n");}
int main() {
int i;
scanf("%d", &i); // Prevent from optimizing out the "if"
i && foo();
return 0;
}
我在我的mac上使用-O3 level * 编译了两个程序,并比较了输出:
gcc -c -O3 a.c
gcc -c -O3 b.c
cmp a.o b.o
cmp
没有输出,所以文件是相同的。没有-O3标志的编译产生了不同的输出。
<小时/> *
gcc --version
命令打印
Apple LLVM 5.0 (clang 500.2.79) (based on llvm 3.3svn)
答案 1 :(得分:1)
需要一个更聪明的编译器来确定它可以忽略来自someIntMethod
的返回值(尽管我怀疑大多数编译器会这样做)。但更严重的是,如果函数不是inline
,它将 采取额外的周期来传递值,即使它将被丢弃,所以第一个可能更有效。 / p>
这就是说,确定的唯一方法是使用与发布版本一致的编译器和选项编译它们,并查看它生成的汇编。