Skip to main content

IAR Embedded Workbench for Arm 9.70.x

インライン関数

このセクションの内容:

関数インライン化とは、定義がコンパイル時に判明している関数を、呼び出しによるオーバヘッドを解消するために、呼び出し元関数の本体に統合することです。この最適化は、最適化レベルが[高]の場合に実行可能で、通常は実行時間が短縮されますが、コードサイズは増加する可能性があります。生成されるコードのデバッグが困難になる場合があります。インライン化が実際に行われるかどうかは、コンパイラのヒューリスティックに基づいて決定されます。

インライン化する関数は、コンパイラがヒューリスティックにより決定します。実行する最適化の内容(速度、サイズ、速度とサイズのバランス)に応じて、異なるテクニックが使用されます。サイズを最適化する際は、通常コードサイズは増加しません。

CとC++の動作の比較

C++では、個別のコンパイル単位における特定のインライン関数のすべての定義は、そのまま同じにする必要があります。関数がコンパイル単位のいずれかでインライン化されていない場合、これらのコンパイル単位からの定義のひとつが関数の実装として使用されます。

Cでは、インライン関数のインライン化されていないバージョンを含むコンパイル単位を手動で1つ選択する必要があります。これは、そのコンパイル単位内で関数をexternとして明示的に宣言することにより行います。複数のコンパイル単位で関数をexternとして宣言すると、リンカは複数定義エラーを出力します。また、Cではインライン関数は静的変数や関数を参照できません。

以下に例を示します。

// In a header file.
static int sX;
inline void F(void)
{
  //static int sY; // Cannot refer to statics.
  //sX;            // Cannot refer to statics.
}

// In one source file.
// Declare this F as the non-inlined version to use.
extern inline void F();

関数のインライン化を制御する機能

関数のインライン化を制御するしくみはいくつかあります。

  • inlineキーワード。

    CまたはC++モードで関数をコンパイルする場合、キーワードはそれぞれ標準のCまたは標準のC++における定義に従って解釈されます。

    主な動作の違いは、標準のCでは一般的にヘッダファイルでインライン定義を提供できません。コンパイル単位のひとつでインライン定義をexternと定義することにより、外部の定義を提供する必要があります。

  • #pragma inlineは、inlineキーワードと似ていますが、コンパイラは常にC++のインラインセマンティクスを使用する点が異なります。

    #pragma inlineディレクティブを使用することで、コンパイラのヒューリスティックを無効化して、インライン化を強制するか、完全に無効にすることができます。詳細については、inlineを参照してください。

  • --use_c++_inlineを使用すると、標準のCソースコードファイルをコンパイルする際にC++の動作を使用するようコンパイラに強制します。

  • ‑‑no_inline#pragma optimize=no_inline#pragma inline=neverは、いずれも関数のインライン化を無効にします。デフォルトでは、関数のインライン化は最適化レベル[高]で有効になっています。

コンパイラは、定義が分かっている場合にのみ関数をインライン化することができます。これは通常、現在の翻訳単位にのみ制限されています。ただし、複数ファイルコンパイルの--mfcコンパイラオプションが使用される場合、コンパイラは複数ファイルコンパイル単位内のすべてのコンパイル単位の定義をインライン化できます。詳細については、複数ファイルのコンパイルユニットを参照してください。

関数のインライン化の最適化の詳細については、関数インライン化を参照してください。