最適化レベル3を使用しているGCCコンパイラは静的関数をインライン化しますが、非静的関数をインライン化しません。それ以外の場合は、静的であるか非静的であるかにかかわらず関数をインライン化します。 静的関数または非静的関数をどのようなパラメーターでインライン化するか選択します。Cコンパイラの最適化(gcc):自動的に静的でない関数をインライン化する
答えて
GCCのマニュアルから:まだもっと
-O3最適化します。 -O3は-O2で指定されたすべての最適化をオンにし、-finline-functions、 -funswitch-loops、-fpredictive-commoning、-fgcse-after-reload、-ftree-loop-vectorize、-ftree-loop- -fsplit-paths -ftree-slp-vectorize、-fvect-cost-model、-ftree-partial-pre、および-fipa-cp-cloneの各オプションを指定します。あなたの発言は、-finline-機能オプションから来ているよう
ようだ:
-finline-機能
彼らはインライン宣言されていない場合でも、インライン展開のためのすべての機能を考えてみましょう。コンパイラは、この方法で統合する価値のある関数 をヒューリスティックに決定します。
特定の関数へのすべての呼び出しが統合され、その関数が "静的"と宣言されている場合、その関数は通常、アセンブラコードとして出力されません。
レベル-O3で有効になります。
実際、すべての関数は、-O3最適化モードでgccによってインライン化されているかどうかに関係なく、インライン、
ここではgccのmanページ(-Winlineオプション)の別の塊だ:
コンパイラが関数をインライン化するかどうかを決定するためにヒューリスティックの様々なを使用しています。たとえば、コンパイラ は、インライン化される関数のサイズと、現在の関数 で既に行われたインライン化の量を考慮に入れます。
gccは、関数のサイズと関数内で行なわれたインライン化を使用してインライン化するかどうかを選択します。これらのヒューリスティックスについてもっと知りたい場合は、gccのソースコードを調べなければならないかもしれません:)
ここで重要なヒューリスティックは、静的な単一コール関数のためのものであり、まともな最適化Cコンパイラによるものです。インライン化は実質的にサイズ対速度のトレードオフですが、インラインでないバージョンに到達できないため、効果的に失われることはありません。当然、シワや特殊なケースがありますが、それは一般的な考えです。 – doynax
- 1. GCCコンパイラ最適化機能インライン化
- 2. 翻訳単位とgcc間で自動的にインライン化された関数4.6
- 3. コンパイラの動的最適化とは
- 4. gccは静的変数を自動的に0に初期化しますか?
- 5. "静的"ループの最適化
- 6. gcc静的リンカーは、静的ライブラリから関数を正しくインライン化できますか?
- 7. GCCのリンク時最適化と静的リンクライブラリの使用
- 8. GNU GCCコンパイラの最適化とデバッグ
- 9. ループの間静的なままであるプロパティのコンパイラの最適化
- 10. 静的メンバー関数をインライン化できますか?
- 11. 静的変数最適化のC分岐
- 12. Visual C++コンパイラの最適化
- 13. C++コンパイラの最適化
- 14. JITコンパイラは不要な変数宣言を最適化(インライン化)しますか?
- 15. jettyのwebapp静的コンテンツの最適化
- 16. gccが-O2のない関数をインライン化できない
- 17. Androidバージョンのチェックと静的最終定数のインライン化
- 18. 動的クエリの最適化
- 19. gccコンパイラの特定の最適化(デッドコードエリミネーション)を無効にする
- 20. Objective-Cで静的クラスメソッドをインライン化できますか?
- 21. 現代のコンパイラは自動的に次のC++コードを最適化しますか?
- 22. MySQLはリピートクエリを自動的に最適化しますか?
- 23. lpSolve - 目的関数を特定の値に最適化する
- 24. "tree - ***"ファミリーのGCC最適化オプションの目的は何ですか?
- 25. WindowsフォームInitializeComponentのパフォーマンスを自動的に最適化
- 26. インライン関数と静的インライン関数の違い
- 27. ステップ関数を使用した目的関数の最適化
- 28. 初期化関数で静的クラスメンバーを初期化する
- 29. GCC handpicking最適化
- 30. 静的インライン関数はスレッドセーフですか?
GCCのソースコードの外に完全なリストがないことは間違いありません。もちろん、これはコンパイラからコンパイラまで、バージョンによって異なる可能性があります。ただし、標準にはいくつかの制限があります。 –
静的関数は、コンパイラがその使用方法をすべて知っているため、そのアドレスが返されない場合にインライン化できます。非静的関数は、他のソースファイルのコードが呼び出す可能性があるため、必ずしもインライン展開できません。あるいは、少なくともインラインでない関数は、たとえローカルでの使用がインライン化されたとしても、他の翻訳単位から呼び出すことができるように定義する必要があります。 –