2008年11月26日水曜日

カーネルで使われるC99やGCCの拡張機能

developerworksに「GCC hacks in the Linux kernel」という記事が載ってるのを発見。ざっと目を通してみた。別段新しいこともなさそうだけど、カーネルのソースを例示してまとめてあるので、私のように忘れっぽい人間にはソース読む際に助かるな。


「カーネル内でもっとも広く使われる最適化技法」として紹介されていたのは、__builtin_expectの利用だった。これは、条件分岐個所に通常適用されることが多い値を指定しておくことで、コモンケースでの処理を高速化するための組み込み関数だ。GCC 2.96からサポートされている関数なので今更感はあるが、このぐらい枯れてると私が書くような記事でも取り上げることがあるかも。カーネルでは2つのマクロを定義し,条件が真になりそうな個所をlikely、偽になりそうな個所をunlikelyで指定している。これらのマクロの定義は、値を「1」か「0」に正規化するために、次のようにちょっとトリッキーになっている(unlikelyの方は別にこんなことしなくてもいいと思うけど、記述をそろえるため…かな)。


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

0 件のコメント: