web-dev-qa-db-ja.com

C ++テンプレートとインライン

単純な(非テンプレート)クラスを記述しているときに、関数の実装が「適切な場所」で提供されている場合、それは自動的にinlineとして扱われます。

class A {
   void InlinedFunction() { int a = 0; }
   // ^^^^ the same as 'inline void InlinedFunction'
}

テンプレートベースのクラスについて話すとき、このルールはどうですか?

template <typename T> class B {
   void DontKnowFunction() { T a = 0; }
   // Will this function be treated as inline when the compiler
   // instantiates the template?
};

また、inlineルールはネストされていないテンプレート関数にどのように適用されますか?

template <typename T> void B::DontKnowFunction() { T a = 0; }

template <typename T> inline void B::DontKnowFunction() { T a = 0; }

ここで、最初のケースと2番目のケースでは何が起こりますか?

ありがとうございました。

37
Yippie-Ki-Yay

私が知る限り、テンプレート化された関数は自動的にインライン化されます。ただし、実際には、ほとんどの最新のコンパイラーはインライン修飾子を定期的に無視します。コンパイラーの最適化ヒューリスティックは、人間のプログラマーよりもインライン化する関数を選択する作業がはるかに優れています。

1
Puppy

インスタンス化するとクラスを取得するため、その関数は通常のメンバー関数のようなものです。そのクラスで定義されているため、関数は自動的にインライン化されます。

しかし、ここではそれほど重要ではありません。とにかく、プログラムで関数テンプレートまたはクラステンプレートのメンバーを複数回定義できます。テンプレート以外の場合のように、コンパイラーにそのことを伝えるためにinlineを使用する必要はありません。

Inlineキーワードは「ルール」ではありません。それは単にコンパイラーへの提案/ヒントであり、それでそれが何をするかは完全にそれとその実装次第です。これを念頭に置いて、あなたの例で何が起こるかを知ることは不可能です。コンパイラーは実際にはそれらのすべて、一部、またはまったくインライン化しない場合があります。

1
RC.