微观优化使用和运算符

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)

没有任何转让.

我们理解程序员不应该专注于微优化,但它实际上只是出于学术目的.

das*_*ght 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;
}
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)