2009-10-26 11 views
25

GCCは、C++コードをコンパイルするときに、inlineキーワードでマークされていない関数をインライン化することによって速度を最適化しようとしていますか?GCCインラインC++は 'inline'キーワードなしで機能しますか?

+10

仕様によると、C++の 'inline'キーワードは、コンパイラの最適化とは全く同じ名前ではありません。このキーワードは、単にリンカーが関数の複数の定義を参照することを期待する必要があることを意味します。インライン*最適化*がより簡単になるようにしているのは(完全な定義を複数の翻訳単位で表示できるためですが)、それが得られるほど近くにあります。コンパイラは 'inline'としてマークされていない関数をインライン化することができ、' inline'としてマークされた関数は必ずしもコンパイラによってインライン化されるとは限りません。 – jalf

+2

クラス定義内で定義されたメソッド(つまり、{...};の間はキーワードなしでもデフォルトで 'inline'です) – MSalters

答えて

31

はい。どんなコンパイラも、それが良いアイデアだと思うときはいつでも自由にインライン化することができます。 GCCも同様です。

-O2最適化レベルでは、コードのサイズを増やさない場合、コンパイラが実行する価値があると考えられる場合(ヒューリスティックが使用されます)の場合にインライン展開が行われます。 -O3では、コンパイラがコードのサイズを大きくするかどうかに関係なく、コンパイラが実行する価値があると考えるたびに実行されます。さらに、すべてのレベルの最適化(有効化された最適化)では、一度しか呼び出されない静的関数がインライン展開されます。

+0

GCCは'-finline-functions'"インラインで宣言されていなくても、インライン化のためのすべての関数を考慮してください。 "インラインで宣言された関数は、コードサイズを大きくしてもインライン展開の対象になると推論しています。コンパイラに対するインラインからのヒントは廃止されていますが、これは '-O2'を使うとヒントが' inline'というキーワードを持つ場合にコードを大きくするインライン関数しかないため、 -O3'それは時代遅れ(Iヒントを意味する... 'inline'キーワードは他の目的を持っています)。 –

+1

'-O2'でインライン化するために大きな関数を作成するのに問題があります。 -O3でインライン化されたすべての関数も-O2でインライン展開されます。GCCは '' -finline-small-function''については、 "関数呼び出しコードが期待していた関数呼び出しコードよりも小さいときに関数を呼び出し元に統合するので、プログラム全体のサイズが小さくなります"と述べています。しかし、-O2を指定してもアセンブリを見ると、明らかにコードが大きくなります。あなたはO3のインラインがO2のない例を持っていますか? –

+0

@AnTコンパイラが一度呼び出される関数をインライン展開しないようにする方法。 – bharath

7

高いレベルの最適化を有効にしている場合は特にそうです。

これを無効にするためにコンパイラに提供できるフラグがあります:-fno-inline-functions。

+2

実際には、-fno-inline-functionsは自動インライン化と-fno-inlineを抑制しますすべてのインライン展開を抑制します(ソース:http://gcc.gnu.org/onlinedocs/gnat_ugn_unw/Switches-for-gcc.html)。 – KeatsPeeks

+0

あなたのコメントに基づいて更新します。ありがとうございます。 – Marcin

3

'-finline-functions'または '-O3'を使用すると、インライン関数が使用されます。 '-finline_limit = N'を使用して、インライン展開の量を調整することもできます。

1
+0

は、機能が本質的に重複し、速度のためにメモリを犠牲にするという点で高価です。 –

+1

@ Ape-in​​ago:それは...演算子やアクセサのような小さな共通関数の場合、関数呼び出しの周りにレジスタを保存して復元するよりインライン化する命令が少なくなるので、インラインバージョンはしばしば安価です。 – Adisak

+0

*潜在的に高価です* –

1

はい、それはありません、それはまた、非インライン化が生成されますが、 "-O3 このオプションは、このような関数のインライン化などは、より高価な最適化をオンにします"他の翻訳単位からの呼び出しには、これと同じ機能が必要です。static以外の機能体は、inlineです。

inline関数の場合、関数が特定の変換単位で使用されている場合は関数本体を提供できないため、これは問題ではありません。

関連する問題