float
またはdouble
タイプのいずれかに基づいて代数計算を実行するテンプレートクラスの大規模なライブラリを維持しています。多くのクラスには、アクセサメソッド(ゲッターとセッター)および少量のコードを実行するその他の関数があります。したがって、このような関数は、コンパイラーが定義を見つけるときにインラインとして修飾する必要があります。対照的に、他のメンバー関数には高度なコードが含まれているため、インライン化するよりも呼び出す方が適切です。
関数定義の大部分はヘッダーにあり、実際にはヘッダーに含まれる.inlファイルにあります。float
しかし、関数定義がとの明示的なインスタンス化によって.cppファイルにうまく存在するクラスもたくさんありますdouble
。これは、ライブラリの場合に行うのがかなり良いことです(ここで理由を説明します)。そして最後に、関数定義が.inlファイル(アクセサーメソッド)と.cppファイル(コンストラクター、デストラクタ、および大量の計算)にまたがって分割されているクラスがかなりあり、それらすべてを維持するのは非常に困難です。
一部の関数がインライン化されないようにする信頼できる方法を知っている場合にのみ、すべてのクラス実装を.inlファイルに入れます。または、inline
キーワードがコンパイラーに一部の関数をインライン化するように強く提案できる場合は、.cppファイルに入れます。ではない。ライブラリ内のすべての関数定義を.cppファイルに配置することを強くお勧めしますが、アクセサメソッドはライブラリ全体で広く使用されているため、参照されるときは常にインライン化され、呼び出されないようにする必要があります。
したがって、これに関連して、私の質問は次のとおりです。
ここで最近学んだように、でマークされているかどうかに関係なく、コンパイラによって自動的にインラインとして修飾される
inline
という事実を考慮して、テンプレート関数の定義をマークすることは意味がありますか?inline
そして最も重要なのは、テンプレートクラスのすべてのメンバー関数の定義を1つのファイルにまとめたいので、.inlまたは.cpp(.cppの場合は明示的なインスタンス化を使用)のいずれかです。コンパイラー(MSVCおよびGCC)に、どの関数をインライン化する必要があり、どの関数をインライン化するべきでないかを示唆するために、テンプレート関数でそのようなことが可能かどうか、どうすればこれを達成できるか、または本当に方法がない場合( )、最も最適な妥協点は何でしょうか?
----------
編集1:inline
キーワードは、関数をインライン化するためのコンパイラーへの単なる提案であることを私は知っていました。
EDIT2:私は本当に知っています。私はコンパイラーに提案をするのが好きです。
EDIT3:私はまだ知っています。それは問題が何であるかではありません。
----------
いくつかの新しい情報を考慮して、2番目の質問と密接に関連する3番目の質問もあります。
3.コンパイラが最近非常に賢く、インライン化する関数と呼び出す関数をより適切に選択でき、リンク時のコード生成とリンク時の最適化が可能である場合、.cppを効果的に調べることができます。 -インライン化または呼び出される運命を決定するためにリンク時に関数定義を配置します。おそらく、すべての定義をそれぞれの.cppファイルに移動するだけでよい解決策になるでしょうか。
----------
それで、結論は何ですか?
まず第一に、私はダニエル・トレビエンとジョナサン・ウェイクリーの構造化された十分に根拠のある答えに感謝します。両方に賛成したが、1つだけを選択する必要があった。しかし、与えられた答えはどれも私に受け入れられる解決策を提示しなかったので、選ばれた答えはたまたま私が最終決定を下すのに他の人よりもわずかに助けになったものでした。その詳細は興味のある人のために次に説明されます。
ええと、私は常にコードのパフォーマンスを維持と開発の便利さよりも評価してきたので、最も受け入れられる妥協案は、すべてのアクセサーメソッドとそれぞれのその他の軽量メンバー関数を移動することだと思います。テンプレートクラスをそれぞれのヘッダーに含まれる.inlファイルに入れinline
、コンパイラに適切なヒント(またはインライン強制用のキーワード)を提供するためにこれらの関数をキーワードでマークし、残りの関数をそれぞれに移動します.cppファイル。
すべてのメンバー関数定義を.cppファイルに配置すると、MSVCのDaniel Trebbien(開発の古い段階)およびGCCのJonathan Wakely(開発の古い段階)によって確認されたように、リンク時間の最適化に関するいくつかの問題を解き放ちながら、軽量関数のインライン化が妨げられます。開発の現在の段階で)。また、すべての関数定義をヘッダー(または.inlファイル)に配置することは、各クラスの実装を.inlファイルと.cppファイルにソートし、この決定のボーナス副作用を組み合わせることの要約的な利点を上回りません。プリミティブアクセサメソッドのコードのみがライブラリのクライアントに表示され、よりジューシーなものがバイナリに隠されています(ただし、これが主な理由ではないことを確認しますが、このプラスはソフトウェアライブラリに精通している人には明らかでした)。inline
関数のインラインステータスを促進するため(この特定のケースでは、キーワードを両方の場所に配置するか、1つだけに配置するかはまだわかりません)。