c++ - 如何优化默认的 if-branch

标签 c++ gcc optimization icc gcc4.9

我有以下代码。鉴于 foo 是如何被调用的,可以为 GCC 和 Clang 提供哪些编译器参数来像 icc 一样优化 if 语句?

代码:

#include <cstdlib>

int foo(int i, bool b = false)
{
   if (b) ++i;
   return ++i;
}

int boo(int i)
{
   return ++i;
}

static const bool global_b = false;
int goo(int i, bool b = global_b)
{
   if (b) ++i;
   return ++i;
}

int main(int argc, char* argv[])
{
  int i = atoi(argv[1]);
  return 2 * foo(i) + 3 * boo(i) + 7 * goo(i);
}

GCC 4.9 -O2 反汇编:

foo(int, bool):
   cmp   sil, 1
   sbb   edi, -1
   lea   eax, [rdi+1]
   ret

goo(int, bool):
   cmp   sil, 1
   sbb   edi, -1
   lea   eax, [rdi+1]
   ret

boo(int):
   lea   eax, [rdi+1]
   ret

Clang 3.4 -O2 反汇编:

foo(int, bool):
   movzbl %sil, %eax
   leal   1(%rdi,%rax), %eax
   ret
goo(int, bool):
   movzbl %sil, %eax
   leal   1(%rdi,%rax), %eax
   ret
boo(int):
   leal  1(%rdi), %eax
   ret

IntelCC 13 -O2 反汇编:

foo(int, bool):
 incl %edi
 movl %edi, %eax
 ret
goo(int):
 incl %edi
 movl %edi, %eax
 ret       
boo(int):
 incl %edi
 movl %edi, %eax
 ret

模板化 foo 我们得到以下内容:

template <typename T>
T foo_t(T i, bool b = false)
{
   if (b) ++i;
   return ++i;
}

GCC 4.9 是隐式内联的:

add eax, 1

最佳答案

Intel 的编译器是错误的。如果没有像 gcc 的 -fwhole-program 这样的选项(它会自动将除 main 之外的所有函数都标记为 static,即这个翻译单元的本地函数),我们不知道 foo 是否从另一个翻译单元调用,因此编译器不能假设它总是用等于 false 的第二个参数调用。

关于c++ - 如何优化默认的 if-branch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25419422/

相关文章:

c - 为什么我在使用 GCC 编译时不必包含我的头文件?

linux - Linux下thumb汇编

c++ - 谁能告诉我什么时候调用terminate(),什么时候调用unexpected()?

c++ - 如何将图形添加到 C++

c++ - __cyg_profile_func_enter 和 g++ 2.95.4

python - 从字典中查找句子字谜的有效方法?

sql - SQLite触发器优化

arrays - 确定是否可以在没有分支的情况下生成整数序列的技术?

java - C/C++/Java问题: will the expression used in for loop evaluate multiple times?

无法识别 C++ 标准库头