Everything

インライン関数指定(__inline)


インライン関数であることをコンパイラに示唆します。

[機能]

-

コンパイラは,可能であれば__inline宣言した関数をインライン展開します。

-

同一翻訳単位内で,同じ関数に対して#pragma noinlineと__inlineを同時に指定する場合はエラーとします。

-

オプション-Oinline_levelにより,インライン展開対象となる関数の条件が変化します。
オプションの影響については「2.5.1 コンパイル・オプション」の-Oinline_levelの説明を参照してください。

-

__inline宣言した関数は,その関数を呼び出したところにインライン展開します。

-

指定した関数の呼び出しと定義の間で下記のいずれかに当てはまる場合,警告メッセージが出力されてインライン指定は無視されます。

-

引数の数が異なる場合

-

戻り値の型や引数の型が異なり,型変換が出来ない場合
型変換が可能な場合には,型を変換してインライン展開します。
なお,変換する場合には,戻り値の型は呼び出し側の型に,引数は関数定義での型に変換します。
ただし,-strict_stdオプション指定時はエラーとなります。

-

指定した関数が次のいずれかに当てはまる場合,インライン指定は無視されます。なお,メッセージは出力されません。

-

可変個引数の関数

-

処理中に自分自身を呼び出す関数

-

展開対象関数のアドレスを介して呼び出しを行っている場合

[効果]

-

関数の呼び出しと復帰コードが無くなるため,実行速度が速くなります。

-

インライン展開されたコードが,関数呼び出し前後のコードと合わせて最適化対象になるため,最適化の効果が大きくなる場合があります。

-

インライン展開の回数が多いと,コードサイズが大きくなる可能性があります。

[方法]

-

関数の定義に,__inlineを追加します。

[使用例]

extern int      gi;
__inline int    i_func(int i)
{
        return ++i;
}
 
void func(int j)
{
        gi = i_func(j);
}

[注意]

-

__inlineは,インライン展開されることを保証するものではありません。コンパイル時間やメモリ使用量の増大を考慮した制限により,インライン展開を抑止する場合があります。

-

-lang=c99オプションの指定時,キーワード__inlineはキーワードinlineの別名とします。すなわちC99のインライン仕様に従います。