C++ および C90 モードでのインライン関数

inline キーワードは C90 では使用できません。

C90 での __inline の効果と C++ での __inline および inline の効果は同じです。

extern 関数をインライン展開の対象として宣言するには、使用されるすべての変換単位でその関数を定義する必要があります。また、各変換単位では同じ定義を使用する必要があります。

すべての変換単位で関数を定義するという要件は、外部リンケージがある場合にも適用されます。

インライン関数が複数の変換単位で使用される場合、その定義は通常はヘッダファイルに配置されます。

非インライン関数の定義をヘッダファイルに配置しないで下さい。変換単位ごとに関数が作成されることがあります。非インライン関数が extern 関数である場合は、リンク時にシンボルの重複が生じます。非インライン関数が static である場合は、不要なコードの重複が生じる場合があります。

C++ の構造体、クラス、または共用体の宣言で定義されたメンバ関数は、暗黙的にインライン展開されます。これらは inline キーワードまたは __inline キーワードを使用して宣言された場合と同様に処理されます。

インライン関数は、明示的に static として宣言されていない限り、extern リンケージを持っています。インライン関数を static として宣言する場合は、関数のアウトオブラインコピーがその変換単位で一意になるようにする必要があるため、インライン関数を static として宣言すると、不要なコードの重複が生じる場合があります。

コンパイラは、関数をインライン展開できない場合、およびインライン展開しない場合に、関数のアウトオブラインコピーへの通常の呼び出しを生成します。

関数を使用するすべての変換単位で関数を定義するという要件は、つまり、コンパイラがすべての extern インライン関数のアウトオブラインコピーを生成する必要がないことを意味します。コンパイラが extern インライン関数のアウトオブラインコピーを生成する場合は共通グループを使用するため、リンカは重複を削除して、異なるオブジェクトファイルの同じアウトオブライン関数に 1 つのコピーのみを保持します

Show/hide関連項目

Copyright © 2010 ARM. All rights reserved.ARM DUI 0472BJ
Non-ConfidentialID011811