unlikelyマクロについて

MySQLのソースやLinuxカーネルのソースを眺めるとしばしば出てくる、


if (unlikely(a == b)){
....
}
みたいな構文ですが、これの解説。

このunlikelyはマクロ関数で、引数として渡された条件がほとんどの場合に偽になることをコンパイラに教えるものです。コンパイラはこの指示に従い、条件が成り立たない場合に有利となるアセンブラコードを出力します。unlikelyの対はlikelyです。

具体的にどういうマクロかというと、MySQLのソースにおいては include/my_global.h にて下記のように宣言されています


#if !defined(__GNUC__) || (__GNUC__ == 2 && __GNUC_MINOR__ < 96)
#define __builtin_expect(x, expected_value) (x)
#endif

#define likely(x) __builtin_expect((x),1)
#define unlikely(x) __builtin_expect((x),0)

これにより、コンパイラがGNUCでなかったり、あるいは、GNUCのバージョンが2.96以下で、__builtin_expectに対応できていない場合は、通常のif文に置換されコンパイルが通ります。

Linuxカーネルでの宣言は詳細未確認ですが、たしか


#ifndef likely
...
#endif /* !likely */
で囲まれているので、MySQLでの宣言が優先されるはずです。(とはいえ内容はどっちでも殆ど変わりませんが)