2 c c++ optimization
假设这种情况,你有一个返回void的函数,该方法通常是if的唯一声明
if(condition)
someVoidMethod();
Run Code Online (Sandbox Code Playgroud)
由于某些语言不会继续评估连接的布尔表达式,如果它们中的任何一个返回false.我们想知道通过将返回类型更改为int(或bool/boolean)以及编写此代码而隐含的优化是什么
condition && someIntMethod();
Run Code Online (Sandbox Code Playgroud)
没有任何转让.
我们理解程序员不应该专注于微优化,但它实际上只是出于学术目的.
编译器将为任何合理的优化级别生成相同的代码.两个语句背后的逻辑完全相同,因为&&在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;
}
Run Code Online (Sandbox Code Playgroud)
计划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;
}
Run Code Online (Sandbox Code Playgroud)
我在我的mac上使用-O3 level *编译了两个程序,并比较了输出:
gcc -c -O3 a.c
gcc -c -O3 b.c
cmp a.o b.o
Run Code Online (Sandbox Code Playgroud)
cmp没有输出,所以文件是相同的.没有-O3标志的编译产生了不同的输出.
gcc --version命令打印
Apple LLVM 5.0 (clang 500.2.79) (based on llvm 3.3svn)