__builtin_expect为gcc内置宏,在Linux源码中定义如下:
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
例子(以unlikely为例,likely同理):
int main(char *argv[], int argc)
{
int a = atoi (argv[1]);
if (unlikely (a == 2))
a++;
else
a--;
printf ("%d\n", a);
return 0;
}
这里if中判断的条件是a == 2,但是用unlikely括号起来,表示a!=2的情况更可能发生,即a++不太可能被执行,则编译时会把a++的汇编代码放到return 0后面,而a--就放在汇编指令cmp之后,以确保其顺序执行,节省了跳转指令的时间。