web-dev-qa-db-ja.com

ヘッダーファイルで静的インラインメソッドを定義する必要がありますか?

ヘッダーファイルを含む他のすべてのファイルに対して冗長コピーが作成されるため、ヘッダーファイルに何も定義しないことが通常どのように最善であるかについて読みました。ただし、静的インラインメソッドの場合は、その場で定義する必要があるようです(少なくとも、Visual Studio 2010では定義できません)。したがって、ヘッダーファイルにインターフェイスを記述した場合、クラス定義の外部または.cppファイルで静的インラインメソッドを定義することはできません。

それで、静的インラインメソッドを使用する必要がありますか?そして関連する質問:ヘッダーファイルでメソッドや変数を定義する必要がありますか(定数はどうですか)?

とにかく、奇妙なことに、それは私のC++の本で詳細に説明されているものではありません。

編集:静的インラインメソッドに関する同様の質問を読みましたが、この問題に直接対処しているものはないようです。

20
Some Newbie

ヘッダーファイルに関数定義を追加する方法は?

これは、次の3つの方法で実現できます。

  1. 関数のマーク付けinlineまたは
  2. 関数をstaticまたは
  3. 関数を匿名の名前空間に配置します。

そうする正しい方法は何ですか?

_#1_ ie:関数inlineをマークすることは、1つの定義規則を破ることなくこれを行う正しい方法です。

他の2つのアプローチの何が問題になっていますか?

_#2_と_#3_の両方で、各変換ユニットには独自のバージョンの関数が含まれ、プログラムにはいくつかの異なるバージョンの関数が含まれるため、生成されるバイナリのサイズが大きくなります。
ie:static関数fun()の場合、_&fun_は翻訳単位ごとに異なり、プログラムにはNの異なるバージョンが含まれます。関数の。
また、関数に静的ローカル変数が含まれている場合は、関数インスタンスごとに1つずつ、N個の異なる静的ローカル変数があります。

最初のアプローチでこの問題をどのように回避しますか?

inline関数には外部リンケージがあります。
関数にinlineをマークすると、関数はすべての変換単位で同じアドレスになります。また、インライン関数の本体内で定義された静的ローカルおよび文字列リテラルは、変換ユニット全体で同じオブジェクトとして扱われます。
要するに、インライン関数はすべての変換ユニットで同じアドレスを持ちます。

ヘッダーの_static inline_関数定義はどうなっていますか?

staticキーワードは、関数に内部リンクを強制します。
インラインとして定義された関数の各インスタンスは個別の関数として扱われ、各インスタンスには静的ローカルと文字列リテラルの独自のコピーがあります。したがって、これは_#2_に似ています。

注:
標準では、ユーザープログラムでのinline関数のすべての定義が義務付けられています。関数が使用または呼び出されるすべての変換単位で、まったく同じ定義が必要です。


関連するスタンダーデスの参考文献:

C++ 03標準

.2 1つの定義規則:
パラ3:

すべてのプログラムには、そのプログラムで使用されるすべての非インライン関数またはオブジェクトの定義が1つだけ含まれている必要があります。診断は不要です。定義は、プログラムに明示的に表示することも、標準ライブラリまたはユーザー定義ライブラリに表示することも、(適切な場合は)暗黙的に定義することもできます(12.1、12.4、および12.8を参照)。 インライン関数は、それが使用されるすべての変換単位で定義されるものとします。

7.1.2関数指定子
パラ4:

インライン関数は、それが使用されるすべての翻訳単位で定義され、すべての場合でまったく同じ定義を持つものとします(3.2)。 [注:インライン関数の呼び出しは、その定義が変換ユニットに表示される前に発生する可能性があります。 ]外部リンケージを持つ関数が1つの翻訳単位でインラインとして宣言されている場合、それが表示されるすべての翻訳単位でインラインとして宣言されるものとします。診断は必要ありません。 外部リンケージを持つインライン関数は、すべての変換ユニットで同じアドレスを持つ必要があります。externインライン関数の静的ローカル変数は常に同じオブジェクトを参照します。externインライン関数の文字列リテラルは、異なる変換では同じオブジェクトです。単位。

38
Alok Save

(1)クラス定義の外部または.cppファイルで静的インラインメソッドを定義できません。

ヘッダーファイル内のクラスの外部でstatic inlineメソッドを定義できます。 デモ 。 .cppファイルで定義することはできません。

(2)静的インラインメソッドをわざわざ使用する必要があります

簡単に回避できると思います。独自の目的でヘッダーファイルの本文を表示する必要がある場合は、それらをinlineにするだけです。

(3)ヘッダーファイルでメソッドや変数を定義する必要があります(定数はどうですか)

  1. クラス本体内で、整数型のstatic constデータを定義できます。
  2. staticメソッドはクラス本体内で定義できます
  3. static inlineメソッドは、ヘッダーファイル内のクラス本体内またはクラス本体外で定義できます。
  4. staticデータメンバーは、単一の.cppファイルで定義して1つの定義規則に準拠する必要があります
6
iammilind