在阅读linux源代码的时候,我们经常会发现likely和unlikely,这两个宏语句定义在compiler.h下,

#define likely(x) __builtin_expect(!!(x), 1)

#define unlikely(x) __builtin_expect(!!(x), 0)

这里我们需要先了解__builtin_expect:# define __builtin_expect(x, expected_value) (x)

所以可以发现其实likely(x)和x是一个意思,那么为什么还要费这么一个力气去做复杂化呢?

这都是为了提高系统的速度,当likely取代直接判断的时候,gcc编译器会知道likely的分支更加可能发生,那么我们把它放在前面,这样cache命中的概率也会增高,而如果是unlikely的话,那么这件事情可能就不会发生,我们就应该把它放在后面,通过这样的机制,等于是让上层将意识里更加容易发生的事情告诉系统从而提高了整体的运行速度,从整个系统来讲会有一定的优化