37

単純な (非テンプレート) クラスを作成しているときに、関数の実装が「その場で」提供されている場合、それは自動的に として扱われ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 番目のケースでは何が起こるでしょうか?

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

4

3 に答える 3

14

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

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

于 2010-09-12T14:35:59.053 に答える
1

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

于 2010-09-12T12:59:34.077 に答える
0

私の知る限り、テンプレート化された関数は自動的にインライン化されます。ただし、現実には、最近のほとんどのコンパイラは通常、インライン修飾子を無視します。コンパイラの最適化ヒューリスティックは、インライン化する関数の選択において、人間のプログラマよりもはるかに優れた仕事をする可能性があります。

于 2010-09-12T13:00:19.193 に答える