4

昔どこかで読んだことによると、コンパイル段階でクラスメンバー関数をインライン化する場合は、関数をクラス宣言ブロック内で定義する必要があるようです。

しかし、これには詳細リークという欠点があります。IMHO、他のプログラマーは、.h ファイルを開くときにクラス インターフェイスのみを表示する必要があります。

最初のステートメントは、最新の C++ でもまだ真実ですか? できれば別のファイルで宣言されている関数を強制的にインライン化する方法はありますか?

一般に、クラス宣言ブロック内に短いメンバー関数を保持する方が良いですか?

4

3 に答える 3

7

コンパイル段階でクラス メンバー関数をインライン化する場合は、関数をクラス宣言ブロック内で定義する必要があるようです。

それは本当ではありません。クラス定義内で定義さた関数は、暗黙的に としてマークされinlineます。ただし、クラス内で関数を定義する必要はありませんinline。明示的に要求できます。

struct X {
   void f();
};
inline void f() {}

一方inline、キーワードは、関数がインライン化されることを意味するのではなく、複数の翻訳単位で定義できることを意味します。つまり、複数の翻訳単位にその定義を含む同じヘッダーが含まれている場合、リンカーは失敗しません。重複定義エラーあり

さて、実際のinliningでは、コンパイラは、その関数の定義(インライン化されるコード) を参照することをinline条件として、関数が宣言されているかどうかに関係なく、関数をインライン化するかどうかを決定できます。インライン化されることを意図した関数は、ヘッダーで定義する必要があります (クラス定義の内側または外側にマークされています。inline

さらに、新しいツールチェーンは、プログラム全体の最適化またはその他のリンク時の最適化を実行できます。これにより、リンカーは関数をインライン化する必要があることも決定できます。この場合、関数定義は呼び出しサイトで表示される必要がないため、.cpp ファイル内で定義できます。ただし、本当に関数をインライン化したい場合は、この機能に依存せず、ヘッダーで関数を定義するだけの方がよいでしょう。

于 2012-06-03T01:40:21.773 に答える
2

Q: 関数のインライン化を強制する方法はありますか?

A: いいえ

関数をインラインとして指定する方法に関係なく、コンパイラは無視できる要求です。インライン関数の呼び出しの一部またはすべてをインライン展開するか、まったく展開しない可能性があります。

Q: C++ クラス内のインライン化規則は何ですか?

C++ のインライン メンバ関数

標準 C++ に関する限り、インライン関数は、それが使用されるすべての翻訳単位で定義する必要があります...

これは、プログラム全体で一度だけ定義する必要がある非インライン関数 (1 つの定義規則) とは異なります...

メンバー関数の場合、クラスで関数を定義すると、暗黙的にインラインになります。また、ヘッダーに表示されるため、使用されるすべての翻訳単位で定義する必要があるという規則が自動的に満たされます。

これは素晴らしいFAQです(「ペダンティック」というよりは「実用的」です):

http://www.parashift.com/c++-faq-lite/inline-functions.html

于 2012-06-03T01:36:21.260 に答える
0

最初のステートメントは、最新の C++ でもまだ真実ですか?

David が説明したように、inline キーワードもあります。ポールが述べたように、それは無視できます。

できれば別のファイルで宣言されている関数を強制的にインライン化する方法はありますか?

おそらくコンパイラを設定することによって。とにかく、あなたの後ろで何らかのインリングを行っている可能性があります。例えば。gcc には-finline-functions、特定の最適化レベルでオンになるなどがあります

一般に、クラス宣言ブロック内に短いメンバー関数を保持する方が良いですか、それともいいえですか?

君による。ただし、インライン メソッドを何度も使用している場合は、オブジェクト ファイルのサイズが大きくなり、ビルドしているファイルのサイズが肥大化し、速度が低下する可能性があることに注意してください。

FWIW私は怠惰からヘッダーファイルに実装を入れる傾向があるだけです:)

于 2012-06-03T01:59:31.247 に答える