2011-12-12 8 views
5

コンパイラが最適化を行うのを助けるために、特定の変数の値が特定の範囲の特定の範囲内になければならないことをコンパイラに示す方法はありますか?私はコンパイル時にいくつかの変数の範囲を知ることを可能にするライブラリを書いています。コンパイラが最適化のためにこの情報をコンパイラに何らかの形で伝えることができればうれしいでしょう。私は、すべてのコンパイラが拡張機能として持つことができるように思えますが、すべてのコンパイラで機能するようにできない場合でも、コンパイラのサポートを追加したいと思います。見つかりました)。範囲情報をC++コンパイラに伝えるには?

if(x < COMPILE_TIME_MIN or x > COMPILE_TIME_MAX) 
    return; 
// compiler will assume for code below that x is in range COMPILE_TIME_MIN..COMPILE_TIME_MAX 

これは実行時のチェックです。コンパイラにの範囲を前提にしてのようなチェックをさせないようにするためのトリックがあるのでしょうか?

+2

これはどのような最適化のタイプに役立ちますか? –

+0

テンプレートを使用する場合、コンパイル時にすべての情報がわかっている場合は、実際にコンパイル時間チェックを行うことができます。 –

+0

あなたは "the compiler"というフレーズを使用していますが、あなたは決して私たちに教えてくれません。おそらくg ++やVisual C++のいくつかのバージョンを意味するかもしれませんが、それははっきりしていません。一般的に、最適化は標準では扱われていないため、ここで行うことができるのは実装固有のものです。 –

答えて

6

このような「ヒント」は、コンパイラ固有のものです。

例として、Visual C++ではthe __assume intrinsicを使用してそのようなヒントを提供できます。

は(他のコンパイラも、このような組み込み関数を提供することができるが、私はそれ以上の情報を提供するために他のコンパイラと十分に慣れていないよ。あなたが興味を持っている場合は、あなたのコンパイラのマニュアルを参照してください。)

+3

私のグーグルグーグルでは、gcc 4.5以降でも、同じ構文で '#define __assume(cond)do {if(!(cond))__builtin_unreachable();を使ってこの情報を渡すことができます。 } while(0) ' –

+0

@DrewDormann面白いです。 Visual C++では '__assume(x)'に、gccではスニペットに展開される '#define ASSUME_THIS_THING(x)...'マクロを定義する方が良いでしょう。コンパイラで予約された名前( '__assume'など)で独自のマクロを定義しないのが最善です。 –

+0

うわー、それは最高です。ジェームズ、ドリューの情報をあなたの答えにマージさせてください。それから私は受け入れられるとマークします。 –

3

それは標準ではないですが、gccで、 __builtin_expectというコマンドがあり、目的に合ったマクロがlikelyunlikelyと定義されています。たとえば、カーネル空間での使用についてはhereを参照してください。__builtin_expectはgcc拡張であり、likelyunlikelyが定義されていなくても、ユーザ空間でも使用できます(this question参照)。

+0

上記のコメントに誤字があります: '__builtin_expect'にする必要があります。 GCCは、期待値をヒントとしてのみ使用します。期待値が満たされない場合は避けられません。 –

+0

@MattG、ええ、私は 'buildtin'をどう書いたのか分かりません! – Shahbaz

0

私はこの情報を利用するC++コンパイル手法について知らないが、私はさまざまな静的解析手法について知っている。これらのツールに何かを「伝える」ための一般的な方法は、例えば、assert Sを経由して次のようになります。

assert(x > COMPILE_TIME_MIN); 
assert(x < COMPILE_TIME_MAX); 

しかし通常、これらのツールでもそう、自分自身で、このような「条件の場合」として物事を分析することができるだろう特別な必要はありません。

さらに、範囲が実際に小さい場合は、小さいサイズの変数で表すこともできます。ショートまたはcharを使用して、COMPILE_TIME_MINを追加します。私はコンパイル自体についてはわかりませんが、それはそのようなツールを助けることができます。

最後に、すべての最適化手法と同じように、まずコードをプロファイリングして、これが本当にボトルネックになるかどうかを確認することをおすすめします。さらに、コンパイラは、 "通常の"コードを最適化するように設計されています。手作業の最適化は確かに助けになるかもしれません。

関連する問題