これらの関数の呼び出しを生成する代わりに、関数のインラインを試みます。インラインは可能であれば実行されますが、実行する最適化によってはインラインされない関数もあります。
.-noinline-----------------------. >>- -q--+-inline--+--------------------+-+--------------------->< +-=threshold=num-----+ | .-:-----. | | V | | '-+- + -+----names-+-' '- - -'
C 言語では以下の -qinline オプションが適用されます。
-qinline コンパイラーは、 -qinline オプションに対するサブオプションのすべての他の設定に従って、実行可能なソース・ステートメントが 20 個以下の適切な関数をすべてインラインしようとします。 -qinline が最後に指定された場合は、すべての関数がインラインされます。 -qinline=threshold=num インラインする関数に対してサイズの制限を設定します。実行可能ステートメントの数は、関数をインラインする場合は、num 以下でなければなりません。 num は正の整数でなければなりません。デフォルト値は 20 です。 threshold の値に 0 を指定すると、__inline、_Inline、または _inline キーワードでマークされた関数以外の関数はインラインされません。
num 値は、論理 C ステートメントに適用されます。以下の例に示すように、宣言はカウントされません。
increment() { int a, b, i; for (i=0; i<10; i++) /* statement 1 */ { a=i; /* statement 2 */ b=i; /* statement 3 */ } }-qinline-names コンパイラーは、names にリストされた関数をインラインしません。 name の各関数名は、それぞれコロン (:) で分離します。他のすべての適切な関数はインラインされます。このオプションは、 -qinline を暗黙指定します。
例を以下に示します。
-qinline-salary:taxes:expenses:benefits
これによって、salary、taxes、 expenses、または benefits という名前の関数以外のすべての関数が、可能であればインラインされます。
ソース・ファイルで定義されていない関数については、警告メッセージが出されます。
-qinline+names names にリストされた関数およびすべての他の適切な関数をインラインしようとします。 name の各関数名は、コロン (:) で分離しなければなりません。このオプションは、 -qinline を暗黙指定します。
例を以下に示します。
-qinline+food:clothes:vacation
これによって、インラインに適格なすべての他の関数とともに、可能な場合は、food、clothes、または vacation という名前の関数がすべてインラインされます。
ソース・ファイルで定義されていない関数、または定義はされているがインラインできない関数については、警告メッセージが出されます。
このサブオプションは、threshold 値の設定をすべてオーバーライドします。 -qinline+names と一緒に threshold 値にゼロを使用して、特定の関数をインラインすることができます。例を以下に示します。
-qinline=threshold=0
これに以下を続けて指定します。
-qinline+salary:taxes:benefits
これによって、salary、taxes、または benefits という名前の関数のみ が、可能な場合にインラインされ、それ以外はインラインされません。
-qnoinline 関数を一切インラインしません。 -qnoinline が最後に指定された場合は、関数は一切インラインされません。
以下の -qinline オプションが C++ 言語に適用されます。
-qinline コンパイラーは、可能な関数をすべてインラインします。 -qnoinline コンパイラーは関数を一切インラインしません。
デフォルトでは、インライン指定はコンパイラーに対する手掛かりとして扱われます。結果は、ユーザーが選択した他のオプションに応じて以下のようになります。
-qinline オプションは、-Q オプションと機能的に同等です。
-g オプションを (デバッグ情報を生成させるために) 指定した場合、インライン化は影響を受けることがあります。 -g コンパイラー・オプションの情報を参照してください。
インラインによって必ずしも実行時間が改善されるとは限らないため、コードに対するこのオプションの効果はユーザー自身がテストしなければなりません。再帰的な関数または相互に再帰的な関数はインラインしないでください。
通常、最適化を要求する (-O オプション) と、アプリケーションのパフォーマンスが最適化され、最適化を要求しないとコンパイラーのパフォーマンスが最適化されます。
インライン化を最大化する場合は、最適化 (-O) に加え、適切な -qinline オプションを指定します。
XL C/C++ (inline、_inline、_Inline、および __inline) の C 言語キーワードは、-qnoinline 以外の -qinline オプションをすべてオーバーライドします。コンパイラーは、その他の -qinline オプションの設定に関係なく、これらのキーワードでマークされた関数をインラインしようとします。
コンパイラーでは、コンパイラーにインラインさせたい関数を指定するために使用できるキーワード・セットを提供します。機能的に同等なキーワードは、以下のとおりです。
例を以下に示します。
_Inline int catherine(int a);
関数 catherine をインラインすることをコンパイラーに指示します。これは、関数呼び出しではなく関数に対してコードが生成されることを示します。
データとともにインライン指定子を使用する、または main() 関数を宣言すると、エラーが生成されます。
デフォルトでは、関数のインラインはオフであり、インライン指定子で修飾した関数は、単に extern 関数として扱われます。関数のインラインをオンにするには、 -qinline または -Q コンパイラー・オプションのいずれかを指定します。-O または -qoptimize コンパイラー・オプションを指定して、最適化をオンにすると、インライン化もオンになります。
再帰的関数 (その関数そのものを呼び出す関数) は、最初のオカレンスでのみインラインされます。関数内部からのその関数への呼び出しはインラインされません。
指定したサイズよりも小さい関数すべてを自動的にインラインするには、 -qinline または -Q コンパイラー・オプションを指定することもできます。しかし、最高のパフォーマンスを得るには、自動インラインを使用するのではなく、インライン・キーワードを使ってインラインしたい関数を選ぶようにしてください。
インライン関数は、宣言と定義を同時に行うことができます。インライン・キーワードの 1 つを指定してインライン関数を宣言する場合、インライン・キーワードなしで定義することができます。以下のコードの断片では、インライン関数定義を示します。インライン・キーワードは関数定義および関数宣言の両方で指定されることに注意してください。
_inline int add(int i, int j) { return i + j; } inline double fahr(double t);
myprogram.C をコンパイルし、関数を一切インラインしないようにするには、以下を入力します。
xlc++ myprogram.C -O -qnoinline
myprogram.c をコンパイルして、12 行未満の関数のインライン化をコンパイラーに試行させるには、以下のように入力します。
xlc myprogram.c -O -qinline=12
関連参照