利用分支预测优化代码

转自:http://blog.chinaunix.net/uid-24774106-id-2183034.html


linux中有likely 和unlikely的宏定义


#define likely(x) __builtin_expect(!!(x),1)
#define unlikely(x) __builtin_expect(!!(x),0)
       
__builtin_expect 宏的含义是通知编译器,对相应的分支预测进行优化。

我们知道顺序执行的代码CPU比较喜欢,因为不需要跳转。对于存在大量跳转或者说是分支的代码, CPU比较抓狂,因为CPU一般会提前 取指令 译码,甚至提前计算一些结果。如果分支预测错了,就会丢弃 之前的指令,这样会影响效率。

如果我们提前知道代码 不同分支的执行概率,我们应该尽量让高概率的分支作为条件转移指令的下一 条指令,这样prefetch 和decode 就会选择条件 转移指令的下一条指令,从而预测成功,这正是我们期望的。


__builtin_expect 就是通知编译器哪个分支出现的概率更高的。

__builtin_expect(!!(x),1)表示,告诉编译器,条件x为真的可能性非常高。

__builtin_expect(!!(x),0)表示,告诉编译器,条件x为假的可能性非常高。


............

(详细分析见原文)

你可能感兴趣的:(编译优化)