微观优化使用和运算符

时间:2014-02-25 16:36:44

标签: c++ c optimization

假设出现这种情况,你有一个返回void的函数,该方法通常是if的唯一声明

if(condition)
    someVoidMethod();

由于某些语言不会继续评估连接的布尔表达式,如果它们中的任何一个返回false。我们想知道将返回类型更改为int(或bool / boolean)并将其写为“

”意味着什么是优化?
condition && someIntMethod();

没有任何转让。

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

2 个答案:

答案 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>

这就是说,确定的唯一方法是使用与发布版本一致的编译器和选项编译它们,并查看它生成的汇编。