2009-11-03 6 views
22

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

+0

http://kerneltrap.org/node/4705 – pmg

+0

重複していますか? http://stackoverflow.com/questions/109710/likely-unlikely-macros-in-the-linux-kernel –

+0

私はこれらの記事をチェックしましたが、どちらもカーネル関連のものについてもう一度話します。私は同じことがユーザーコードで使用できるかどうかを知りたがっています。 –

答えて

40

はい彼らができる何かのためのカーネルヘッダで定義されてかなりの名前です。 In the Linux kernelは、それらが__builtin_expectマクロは、分岐予測を使用するGCC固有のマクロです

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

のように定義されています。プロセッサは、条件が真である可能性があるかどうかをプロセッサに知らせるので、プロセッサは分岐の正しい「側」に命令をプリフェッチできます。

あなたは他のコンパイラでコンパイルを確実にするために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 

正しい分岐予測のためにそれを使用する場合、それは間違いなくあなたの最適化を提供します。

+1

#elseパートでは、(x)と評価されるべきで、空ではないはずですか? –

+1

もちろん、そうです。編集した – Tomas

+0

どのヘッダファイルにこの定義がユーザのインクルードディレクトリに含まれていますか? –

4

(おそらく)と低い()マクロは本当gcc feature

9

「6.2.2レベル1命令キャッシュアクセスの最適化」のWhat Every Programmer Should Know About Memoryを参照してください。正確にこれに関するセクションがあります。

+0

@Nikolaiこのリンクをご利用いただきありがとうございます。 –

+0

問題ありません。これは非常に啓発的な論文であり、3回目の読書でもそうです:) –

関連する問題