C++ 言語アプリケーションでは、このオプションはコンパイラーに関数のインライン化を試行するよう命令する。インライン化は可能な場合に実行されますが、どの最適化が行われるに応じて、インライン化されない関数もあります。
C 言語アプリケーションでは、このオプションはコンパイラーがどの特定の関数のインライン化を試行するかを指定します。
>>- -Q--+--------------------------+--------------------------->< +-!------------------------+ | .-:------------. | | V (1) | | +-+- --+-----------names-+-+ | '-+--' | | (1) | '--------=--threshold------'
C++ 言語では、以下の -Q オプションが適用されます。
-Q | コンパイラーは可能な関数をすべてインライン化します。 |
-Q! | コンパイラーは関数を一切インライン化しません。 |
C 言語では、以下の -Q オプションが適用されます。
-Q | -Q オプションのサブオプションの設定に従って、 実行可能ソース・ステートメントが 20 以下の適切な関数をすべてインライン化しようとします。 -Q が最後に指定されている場合は、すべての関数がインライン化されます。 |
-Q! | 関数を一切インライン化しません。 -Q! が最後に指定されている場合、関数は一切インライン化されません。 |
-Q-names | names によってリストされた関数をインライン化しません。names の各関数名は、コロン (:) で区切ります。他のすべての適切な関数はインライン化されます。 このオプションは、-Q を暗黙指定します。
例を以下に示します。 -Q-salary:taxes:expenses:benefits これによって、salary、taxes、expenses、または benefits という名前の関数以外のすべての関数が、可能であればインライン化されます。 ソース・ファイルに定義されていない関数については、警告メッセージが出されます。 |
-Q+names | names にリストされた関数および他のすべての適切な関数をインライン化しようとします。
names の各関数名は、コロン (:) で区切る必要があります。このオプションは、-Q を暗黙指定します。
例を以下に示します。 -Q+food:clothes:vacation これによって、インライン化に適格な他の関数とともに、可能な場合、food、clothes、または vacation という名前の関数がすべてインライン化されます。 ソース・ファイルに定義されていない関数、または定義はされているがインライン化できない関数については、警告メッセージが出されます。 このサブオプションは、threshold 値の設定をすべてオーバーライドします。 しきい値ゼロを -Q+names と共に使用して、特定の関数をインライン化することができます。例を以下に示します。 -Q=0 これに以下を続けて指定します。 -Q+salary:taxes:benefits これによって、salary、taxes、または benefits という名前の関数のみ が、可能な場合にインライン化され、それ以外はインライン化されません。 |
-Q=threshold | インライン化する関数に対してサイズ制限を設定します。 実行可能ステートメントの数は、インライン化する関数の threshold 以下でなければなりません。
threshold は正の整数でなければなりません。
デフォルト値は 20 です。
しきい値 0 を指定すると、inline 関数指定子のサポートされる形式でマークされた関数を除き、関数はインライン化されません。
threshold の値は、論理 C ステートメントに適用されます。 以下の例で分かるように、宣言はカウントされません。 increment() { int a, b, i; for (i=0; i<10; i++) /* statement 1 */ { a=i; /* statement 2 */ b=i; /* statement 3 */ } } |
デフォルトでは、インライン指定はコンパイラーに対するヒントとして扱われます。 インライン化が発生するかしないかは、選択される他のオプションにも依存する可能性があります。
-Q オプションは、 -qinline オプションと機能的に同等です。
(デバッグ情報を生成するために) -g オプションを指定すると、インライン化に影響する可能性があります。-gコンパイラー・オプションの情報を参照してください。
インライン化は必ずしもランタイム・パフォーマンスを改善するわけではないので、ユーザー自身のコードでこのオプションの効果をテストしてください。
再帰的関数または相互に再帰的な関数はインライン化しないでください。
通常、最適化を要求する (-O オプション) とアプリケーションのパフォーマンスが最適化され、最適化を要求しないとコンパイラーのパフォーマンスが最適化されます。
inline、_inline、_Inline、__inline__ および __inline 言語キーワードは、-Q! を除き、すべての -Q オプションをオーバーライドします。コンパイラーは、他の -Q オプションの設定に関係なく、 これらのキーワードでマークされた関数をインライン化しようとします。
インライン化を最大限にするには、以下を行います。
関数が一切インライン化されないようにプログラム myprogram.c をコンパイルするには、以下のように入力します。
xlc myprogram.c -O -Q!
プログラム my_c_program.c をコンパイルして、12 行未満の関数のインライン化をコンパイラーに試行させるには、以下のように入力します。
xlc my_c_program.c -O -Q=12
関連情報