2016-09-09 4 views
0

コンパイラは、呼び出されるたびにインライン関数の実際の呼び出しをその本体で "置き換える"ことが一般的に知られています。インライン変数のセマンティクス

しかし、C++で提案されているインライン変数はどうですか17?彼らのセマンティクスは何ですか?

答えて

1

通常は関数と変数を定義する必要があります(変数のスペースまたは関数本体のコードのスペース)。インライン関数は複数の定義を可能にするためにリラックスしています(定義はインクルードファイルを通して複数のモジュールに引き込まれるため)。インラインではなく関数が実際に参照されている場合、複数の定義は1つのコピーを除くすべてを破棄し、そのコピーをバイナリの公式のものにすることによってマージされます。

インライン変数は、例えば、等価なことを行います。静的クラスメンバその内容だけが単一メンバー変数の定義であるクラス本体ソースファイルを作成する必要はなく、クラスヘッダーファイル内に静的メンバー変数を定義することができます。クラスヘッダ)は、コンパイラエラーやリンカエラーを引き起こすことなくバイナリ内の単一のインスタンスにマージされます。

This paper discusses it in technical detail.

4

いいえ、インライン関数を呼び出すと実際に関数がインライン化されるという保証はありません。たとえば、インライン関数が再帰的に呼び出した場合、おそらくインライン化されません。同様に、関数ポインタ変数を介した呼び出しは、しばしばインライン化できません。

インライン関数は、外部結合がある場合、インライン関数は、複数の翻訳単位で定義されている場合、リンク時に、リンカーは、定義を含む翻訳単位のいずれかを選択し、残りのすべての参照を解決(すなわち、 ODRコンパイラによってインライン化されなかったもの)を、その関数に対して、選択された翻訳単位の定義に置き換え、残りの定義を破棄します。インライン変数も同じように動作します。

関連する問題