对于条件选择语句,gcc内建了一条指令:对一个条件经常出现,或者该条件很少出现的情况,编译器可根据这条指令对条件分支选择进行优化。
在linux内核中,该条指令被封装成了宏,如likely()和unlikely(),这样使用起来比较方便。
例如,下面是一个条件选择语句:
if (test) {
/* .. */
}
如果想要把这个选择标记成绝少发生的分支:
/* 我们认为test绝大多数时间都会为0.. */
if (unlikely(test)) {
/* .. */
}
相反,如果我们想把一个分支标记为通常为真的选择:
/* 我们认为test通常都不会为0 */
if (likely(test)) {
/* .. */
}
注意:以上三种表达形式,运行结果是一样的,仅是优化了分支选择。