开发人员可以使用__builtin_expect 内置函数来帮助编译器了解分支可能走向哪个方向.
将来,我们可能会为此目的获得一个标准属性,但截至今天至少全部clang,icc并gcc支持非标准属性__builtin_expect.
但是,icc当你使用它时,似乎会生成奇怪的代码1.也就是说,无论使用哪个方向进行预测,使用内置函数的代码都严格地比没有内置代码的代码更糟糕.
以下面的玩具功能为例:
int foo(int a, int b)
{
do {
a *= 77;
} while (b-- > 0);
return a * 77;
}
Run Code Online (Sandbox Code Playgroud)
在三个编译器中,icc唯一一个将其编译为3个指令的最佳标量循环:
foo(int, int):
..B1.2: # Preds ..B1.2 ..B1.1
imul edi, edi, 77 #4.6
dec esi #5.12
jns ..B1.2 # Prob 82% #5.18
imul eax, edi, 77 #6.14
ret
Run Code Online (Sandbox Code Playgroud)
无论 …