我有以下代码。鉴于 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/