26

Linux カーネル コードでこれら 2 つのマクロを見つけました。分岐の場合の最適化のためのコンパイラ(gcc)への指示であることは知っています。私の質問は、これらのマクロをユーザー空間コードで使用できるかということです。最適化を提供しますか?どの例も非常に役立ちます。

4

3 に答える 3

44

はい、できます。Linux カーネルでは、次のように定義されています。

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

__builtin_expect マクロは、分岐予測を使用する GCC 固有のマクロです。条件が真である可能性が高いかどうかをプロセッサに伝え、プロセッサが分岐の正しい「側」で命令をプリフェッチできるようにします。

他のコンパイラでのコンパイルを確実にするために、ifdef で定義をラップする必要があります。

#ifdef __GNUC__
#define likely(x)       __builtin_expect(!!(x), 1)
#define unlikely(x)     __builtin_expect(!!(x), 0)
#else
#define likely(x)       (x)
#define unlikely(x)     (x)
#endif

正しい分岐予測に使用すると、間違いなく最適化が得られます。

于 2009-11-03T15:32:04.433 に答える
12

「6.2.2 レベル 1 命令キャッシュ アクセスの最適化」の下で、すべてのプログラマーがメモリについて知っておくべきことを調べてください。まさにこれに関するセクションがあります。

于 2009-11-03T15:38:46.237 に答える
4

可能性が高い () および可能性が低い () マクロは、実際のgcc 機能である何かのカーネル ヘッダーで定義されたきれいな名前です。

于 2009-11-03T15:30:33.313 に答える