私はSOを使用してこれに対する答えを見つけようとしました。C ++でヘッダーのみのライブラリを構築することのさまざまな長所と短所をリストした質問がいくつかありますが、定量化できる用語でそうするものを見つけることができませんでした。
それで、定量化可能な用語で、従来分離されたc ++ヘッダーと実装ファイルを使用することとヘッダーのみを使用することの違いは何ですか?
簡単にするために、テンプレートは使用されていないと仮定します(ヘッダーのみが必要なため)。
詳述するために、私は記事から私が見たものを賛否両論としてリストしました。明らかに、一部は簡単に定量化できないため(使いやすさなど)、したがって定量化可能な比較には役に立ちません。定量化可能なメトリックを期待するものに(定量化可能)のマークを付けます。
ヘッダーのみの長所
- ビルドシステムでリンカーオプションを指定する必要がないため、含める方が簡単です。
- ライブラリの関数はコードにインライン化されるため、常にすべてのライブラリコードを残りのコードと同じコンパイラ(オプション)でコンパイルします。
- それははるかに速いかもしれません。(定量化可能)
- コンパイラー/リンカーに最適化のより良い機会を与える可能性があります(可能であれば説明/定量化可能)
- とにかくテンプレートを使用する場合は必須です。
ヘッダーのみの短所
- それはコードを膨らませます。(定量化可能)(実行時間とメモリフットプリントの両方にどのように影響しますか)
- コンパイル時間が長くなります。(定量化可能)
- インターフェイスと実装の分離の喪失。
- 循環依存関係を解決するのが難しい場合があります。
- 共有ライブラリ/DLLのバイナリ互換性を防ぎます。
- これは、C++の従来の使用方法を好む同僚を悪化させる可能性があります。
大規模なオープンソースプロジェクト(同様のサイズのコードベースを比較)から使用できる例は、非常にありがたいです。または、ヘッダーのみのバージョンと分離されたバージョンを切り替えることができるプロジェクトを知っている場合(両方を含む3番目のファイルを使用)、それが理想的です。逸話的な数字は、私が洞察を得ることができる球場を私に与えるので、また役に立ちます。
長所と短所のソース:
前もって感謝します...
アップデート:
後でこれを読んでいて、リンクとコンパイルに関する背景情報を少し知りたいと思っている人にとって、私はこれらのリソースが役立つと思いました。
- http://www.amazon.com/Computer-Systems-Programmers-Perspective-Edition/dp/0136108040の第7章
- http://www.yolinux.com/tokyoS/LibraryArchives-StaticAndDynamic.html
- http://www.cyberciti.biz/tips/linux-shared-library-management.html
更新:(以下のコメントに応えて)
答えが異なるかもしれないからといって、測定が役に立たないという意味ではありません。ある時点で測定を開始する必要があります。そして、あなたが持っている測定値が多ければ多いほど、画像はより鮮明になります。この質問で私が求めているのは、全体の話ではなく、全体像を垣間見ることです。確かに、偏見を非倫理的に促進したいのであれば、誰でも数字を使って議論を歪めることができます。しかし、誰かが2つのオプションの違いに興味があり、それらの結果を公開する場合、情報は役立つと思います。
誰もこのトピックに興味がなく、それを測定するのに十分ですか?
シュートアウトプロジェクトが大好きです。これらの変数のほとんどを削除することから始めることができます。1つのバージョンのLinuxで1つのバージョンのgccのみを使用してください。すべてのベンチマークに同じハードウェアのみを使用してください。複数のスレッドでコンパイルしないでください。
次に、以下を測定できます。
- 実行可能サイズ
- ランタイム
- メモリフットプリント
- コンパイル時(プロジェクト全体と1つのファイルの変更の両方)
- リンク時間