複雑なC++プログラムは、複数のオブジェクトをコンパイルしてから作成することがポイントです。各オブジェクトは、典型的には、1つの実装ファイル(例えば、 ".cpp"、 ".cc"など)をコンパイルした結果であり、多数のヘッダを直接的および間接的に含むことができる。したがって、良いクラスを作成してヘッダにヘッダを入れると、そのコードを複数のオブジェクトファイルに含めることができ、コンパイラが重複して生成することになります。さらに、リンカは(そして簡単には)比較できませんバージョンが同等であるかどうかを確認し、冗長コピーを削除します(相対アドレスを使用すると簡単です - 「位置独立コード」 - それは別の話です)。下記のjalfのコメントも参照してください。
したがって、ヘッダーに異なる行外機能を必要としません。インラインキーワードを使用するか、クラス内で定義されているため、コンパイラは余分な作業を行い、アウトラインバージョンが一意に表現されるようにするだけです実行可能ファイル。しかし、行外関数の場合、プログラマに負担が残ります。
さらに、ヘッダーに実装を提供すると、オブジェクトごとに重複してコンパイルされ、ヘッダーを変更するとすべてのオブジェクトが再コンパイルされます。別のオブジェクト内の行外関数を変更し、その単一のオブジェクトを再コンパイルし、他の既存のオブジェクトとリンクして新しい実行可能ファイルを作成することができます。大規模プロジェクトでは、多くのコンパイル時間が節約されます。
+1私は本当にあなたの答えが好きです。しかし、好奇心の中で、あなたはテンプレートについてどのような考えをしていますか?私はテンプレートコードの多くが余分な "インライン"ヘッダーを含むか、またはメソッドの巨大な混乱のいずれかを見てきました。 – GWW
@GWW:テンプレートはそれぞれのタイプの組み合わせごとにインスタンス化されるため、非常に高速で強力ですがクライアントコードに大きく依存します。 C++の歴史を通して、誰もヘッダーを介して "実装"を公開する必要性を避けるための良い方法を見つけました。 #includeを別のファイルにすると、クラス/構造体宣言の後に関数定義を置くのと同じようにAPIを分離しておくことがありますが、最適な結果は関数長、ドキュメントの量とスタイル、複雑さ、クライアントメンバと実装メンテナの比較)。それは*乱雑です:-) –
リンカは、クラス定義の2つのインスタンスが同一であるかどうかを確認する必要はありません(リンカがないとわかりません)。彼らが同じ名前を持っているならば、それは典型的には同一であると仮定し、どちらか一方を削除します。その負担は、ODRに違反しないように常にプログラマにあります。 – jalf