2016-11-24 7 views
0

最適化レベル3を使用しているGCCコンパイラは静的関数をインライン化しますが、非静的関数をインライン化しません。それ以外の場合は、静的であるか非静的であるかにかかわらず関数をインライン化します。 静的関数または非静的関数をどのようなパラメーターでインライン化するか選択します。Cコンパイラの最適化(gcc):自動的に静的でない関数をインライン化する

+0

GCCのソースコードの外に完全なリストがないことは間違いありません。もちろん、これはコンパイラからコンパイラまで、バージョンによって異なる可能性があります。ただし、標準にはいくつかの制限があります。 –

+0

静的関数は、コンパイラがその使用方法をすべて知っているため、そのアドレスが返されない場合にインライン化できます。非静的関数は、他のソースファイルのコードが呼び出す可能性があるため、必ずしもインライン展開できません。あるいは、少なくともインラインでない関数は、たとえローカルでの使用がインライン化されたとしても、他の翻訳単位から呼び出すことができるように定義する必要があります。 –

答えて

0

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のソースコードを調べなければならないかもしれません:)

+0

ここで重要なヒューリスティックは、静的な単一コール関数のためのものであり、まともな最適化Cコンパイラによるものです。インライン化は実質的にサイズ対速度のトレードオフですが、インラインでないバージョンに到達できないため、効果的に失われることはありません。当然、シワや特殊なケースがありますが、それは一般的な考えです。 – doynax

関連する問題