2011-11-25 12 views
4

コンパイラによってインライン化されないこと、またはインライン化されないことをどのように伝えることができますか?コンパイラのインライン呼び出しは何ですか?

コンパイラが特定の呼び出しや計算をインライン化するため、いくつかのマイナーな最適化が無意味であると言われていることがありますが、他の同様の最適化が推奨されるようです。

これらのことを最適化する必要があるかどうかを知るためのルールは何ですか?

+0

... C++にはかなりトリッキーです指定されたフラグを持つ特定のバージョンがコードの特定のリビジョンでインライン化しているかどうかをチェックします)、コンパイラがそれを実行する価値がある場合は、コンパイラがそれを実行することができます。 – delnan

+0

私はそのような場合には、それが価値があるかどうか、そして可能であるかどうかをどのように伝えることができますか? – SirYakalot

+2

可能な常識やプログラミングの知識は十分でなければなりません;)価値があるのは、コンパイラがそれを決定し、あなたよりも頻繁にそれを決めることができる点です(*特に、あなたが知らない推測をしている場合。残念ながらむしろ一般的です)。 – delnan

答えて

0

完全な規則はありません。最適化に関する仮定をテストするためにsometestsさえあります。

0
How can you tell what will or what won't be made inline by the compiler? 

たとえば、インラインキーワードを使用すると、それは単なるヒントになり、コンパイラはそれを尊重する義務がありません。しかし、狂った最適化が必要な場合は、c/C++より低いレベルでコーディングしてアセンブリ呼び出しを使用する必要があるかもしれません。

0

すでに見ていますか?例えば

Does GCC inline C++ functions without the 'inline' keyword?

Why not mark everything inline?

質問あなたの提示は非常に一般的である - それはおろか、どのバージョン、コンパイラのようなものに依存しているため。あなたがやっていたことが時期尚早の最適化であったように思えます。コードをプロファイリングし、速度を遅くしている領域を見つけ出す必要があります。この種のレンダリングでは「これはインライン化されますか?」なぜなら、あなたはコンパイラ、インライン展開、その他の最適化のアフター・エフェクトを見ているからです。

+1

um、私は実際には何もしていませんでした。この質問に対する答えが何であるか不思議です。私はあなたの2つのリンクされた質問への答えを知っている、私は非常に異なるものを求めている。 – SirYakalot

0

詳細は、確実に伝える方法はありませんなぜ、インライン化は、良い習慣があるとき、私はthis C++ FAQ

0

あなたはコンパイラが最適化フェーズの間にインライン化が起こっているかを知ることができません読んでお勧めします。あなたが心で知っておくべき正確なコンパイラの経験則。あなたはインラインにしたいものを指定することができます。

2

何かがインラインであるかどうかを確認する唯一の方法は、アセンブリを見ることです。

何かがインライン化されているかどうかは、コンパイラに依存します。コンパイラはインライン化するかどうかの最終決定をします。

脇時期尚早の最適化:それは本当に重要ならば(あるいはあなただけ興味があれば)あなたは/機能には何のインライン展開をインライン化を強制しないようにコンパイラ固有のプラグマを使用して、あなたが改善することができるかどうかを確認するために適切にプロファイルできますコンパイラよりも意思決定が難しい。タイプはコンパイル時に決定することはできません

  • 事実と呼ばれる機能:

    それでもあなたは関数がインライン化できないことを確認することができますいくつかのケースがあります。

  • 再帰関数は、最大深さを静的に決定できない限り、完全にインライン展開することはできません。
1

これは少し接線に見えるかもしれませんが、私はそれが重要だと思います。

これらを最適化する必要があるかどうかを知るためのルールは何ですか?

私は、W.R.T.の前に再生するためには2つのルールがあると言います。この特定の質問:

  1. 多分問題ではありません。リリースビルドでコードをプロファイリングし、関数呼び出しに関連するオーバーヘッドがコードの主要なボトルネックであることが証明されていない限り、コードの実行の影響を忘れたほうがよいです。

  2. コンパイラがインライン化しないことをほとんどまたはまったく制御できません。 inlineは、そうするのが適切であればコンパイラによって無視されます。インライン化が不可能なものもあります。いくつかのプラットフォームは、force_inlineの行に沿って言語拡張を提供していますが、これらは無視できます。

0

Microsoftのコンパイラは、長い時間のために、すべてののみの機能をインライン化することを強制する/ Obを最適化フラグが明示的にinlineを宣言してきました。これは標準ではなく、デフォルトでは、キーワードをヒント以上のものとみなす標準に従って動作します。 Intel Parallel Studioコンパイラも同様に動作します。

0

コンパイラによってインライン化されないこと、またはインライン化されないことを教えてください。

一般的にはできません。

Herb SutterのInline Reduxの記事を読むことをお勧めします。後者が起こったことを知って、インライン展開が起こる可能性があるときには、多くの情報をで説明します。

たとえば、JIT環境でループを見ると、頻繁にタイプFooのように見える単一のオブジェクト上で実行され、全身をFooに特化させることができます。オブジェクトがFooである場合はループの先頭をチェックし、そうであれば、仮想呼び出しを使用した汎用インラインボディバージョンではなく完全インラインボディバージョンに切り替えます。

だから、インライン化できるものは何ですか?

  • (historical)のインライン化リンク時インライン化(​​いわゆるLTO最適化パッケージの一部)

をコンパイル時:一般的なC++コンパイラが備わっています、それはとき...

に依存しますつまり、コンパイル時に知られている静的な情報に基づいて最適化を行うことができます。

コンパイル時には、静的型の仮想呼び出しをデバッグすることができます(インライン展開の最初のステップ:呼び出された実際の関数を推測する))。これは、定義が可視であるすべての関数もインライン化できることを意味します。

ライブラリのリンク時には、基本的に新しい関数定義が公開されているため、いくつかの呼び出しをインライン化できます。

実行可能ファイルのリンク時に、いくつかのクラスが決して派生しないことを認識することによって、WPA(全プログラム分析)がいくつかの非擬似化を追加することができ、この実行可能ファイルに関してはfinalと考えることができます。 GCCもLLVMも(そして私はVC++が疑問に思っていますが)、クラス階層を保持するバイトコードを持たないので、この最適化を実行することはできません。

コンパイラは、望むのであればバイトコードをダンプしてインラインOS固有の呼び出しを待つことができます。私はこれを行う(C++のために)誰も知っていませんが。唯一の安全な変換を行うことが困難になるので(例えば、関数のアドレスの)メモリはプログラマにアクセス可能であるため、

ランタイムは変更はあなたがすることができますが(一般的にはできません

関連する問題