18

何年もの間、私は標準的な方法でC ++をコーディングしてきました。ヘッダー・ファイル.hppのクラス宣言と、ソース.cppファイルの関数定義を使用しています。最近、私は新しい会社に引っ越しました。コード(ブーストコーディングスタイルの影響を受けているようです)は、ヘッダーファイルをインクルードしてオブジェクト/プログラムバイナリを作成するために、1つの短い.cppファイルを含む.hppファイルで完全にコーディングされています。

オブジェクトごとに.hppおよび.cppファイルを作成するのではなく、ヘッダーファイルにコードを作成することの長所と短所は何でしょうか。これは、プロジェクトがプログラムバイナリにリンクされる共通ライブラリを作成しないことを前提としていますが、代わりに各プログラムバイナリはヘッダーファイル(および1つのソース.cppファイル)の合計から構築されます。これはC++の新しいトレンドですか?

たとえば、テンプレートオブジェクトはヘッダーのみである必要がありますが、非テンプレートクラスをヘッダーファイルに配置してから、これらの一般的なプロジェクトクラスをバイナリにインクルードすることをお勧めします。新しいコードベースを最初から作成していると仮定すると、リンクが少なくなることを意味します。つまり、リンクエラーが少なくなり、ビルドが高速になる可能性があります。プリコンパイル済みヘッダー機能は、ヘッダーファイルを使用するとビルド時間が短縮されることも意味しますか?または、共通の共有ライブラリオブジェクトをリンクするのではなく、バイナリを作成するときにすべてのコードをコンパイルする必要があるため、ビルド時間が長くなりますか?

また、ここではAPIを記述していないことに注意してください(この場合、pimplイディオムのようなものは、実装を非表示にすることで柔軟性を高めます)。顧客サイトで実行するプログラムを記述しています。

前もって感謝します、

4

3 に答える 3

11

頭のてっぺんから:

強み:

  • 目に見える実装(より多くの弱点ですが、場合によって異なります)
  • ライブラリにエクスポートする必要はありません
  • コンパイラがコードの一部を最適化する可能性が高くなります

弱点:

  • 目に見える実装
  • ビルド時間が遅い
  • 肥大化したヘッダーファイル
  • 実装の変更には完全な再構築が必要ですが、実装ファイルに実装を含めることはできません(その特定のファイルまたはライブラリのみをコンパイルします)
  • 循環依存の場合は、前方宣言を使用し、実装ファイルに完全な型のみを含めます。あなたが持っているのがヘッダーだけの場合、これはもはや不可能です。

他にもあると思いますが、これ以上考えられたら編集します。

于 2012-04-11T09:27:57.683 に答える
1

ヘッダーのみのライブラリはビルドシステムを容易にする傾向があり、一般的に依存関係についてあまり気にする必要はありません。

一方、コードを実装ファイルに移動すると、モジュール境界の制御と交換可能なバイナリモジュールの作成が容易になり、インクリメンタルビルドを改善できます。コストはより「ハウスキーピング」です。 私の勘は実装ファイルを好むことであり、提案されたBoost Networking Libraryの作成者からのこのブログ投稿のように、私をバックアップするいくつかのデータポイントがあります 。

于 2012-04-11T09:35:07.697 に答える
0

共通ライブラリは1つであり、コードの一般的な再利用性は別のものです。別のプロジェクトで作成したコードの一部を使用する場合は、コードの巨大なチャンクをコピーして貼り付けてから、個別のコードベースを維持する必要があります。プログラムは、変更されたヘッダーファイルを含むこれらのファイルのみが再コンパイルされる多くのcpp / hファイルとは対照的に、1つの大きなコンパイル単位になるため、コンパイル時間が長くなります。たとえば、私が現在取り組んでいるアプリケーションのフルビルドには7分かかります。変更が深刻でない場合、再コンパイルには約15秒かかります。最後に、コードは読みにくくなる傾向があります。ヘッダーファイルを使用すると、クラスが何のために作成され、どのように使用されるかが一目でわかります。クラスがインプレースで記述されている場合は、ソースコードを不必要に掘り下げる必要があります。

于 2012-04-11T09:28:56.693 に答える