7

最近、c ++プロジェクト内のいくつかの非常に大きなファイルを、多くの小さなファイル(基本的にクラスごとに1つのファイル)に分割しました。これにより、コンパイル時間が2倍以上になり、結果の実行可能ファイルが1.6MBから2.4MBに拡大されました。なぜこれがそんなに大きな違いを生んだのですか?

これは、少数ではなく、多くのファイルにいくつかのヘッダーを含める必要がある直接的な結果ですか?

コミラーオプション:

g ++ -Wall -Wextra -g -ggdb -std = c ++ 0x

私が参照している実行可能ファイルのサイズは、strip-s実行可能ファイルを実行した後のものです。

サイズ:

以前のデバッグシンボル:16MB

デバッグシンボルを使用した後:26MB

デバッグシンボルなしの場合:1.5MB

デバッグシンボルなしの後:2.4MB

追加の質問:

ヘッダーをpch.hppに配置し、g++フラグで-includepch.hppオプションを使用することで、プリコンパイル済みヘッダーをすでに使用しています。これはgccでこれを行うための最適な方法ですか?コンパイル時間への影響はごくわずかのようです。現在プリコンパイルされていない唯一のヘッダーはプロジェクトの一部であり、プロジェクトは大規模な開発中であるため、変更される可能性があります。

4

3 に答える 3

11

これが発生する理由はいくつかあります。ここにブレインダンプがあります。

  • ディスクアクセスが遅い(おそらく、このような大幅な増加の原因ではありません)
  • 同じヘッダーを含む複数の翻訳単位は、それらのヘッダーがすべてのヘッダーに貼り付けられることを意味します。ヘッダーも毎回前処理されます。(最も可能性の高い原因
  • ヘッダーで定義された静的変数または関数は、各変換ユニットで複製されます
  • テンプレートの記号は、それらを専門とする翻訳単位ごとに生成されます

これがあなたを助けることができるいくつかのことです-複数のファイルを保持しますが、コンパイル時間を短縮します:

  • プリコンパイル済みヘッダー
  • バルクビルド-ビルドからファイルを除外しcppますが、コンパイルされる別の実装ファイルにそれらを含めます。
于 2012-10-11T19:50:37.177 に答える
1

これは通常、すべてのコンパイルユニットで多くのシステムヘッダーをコンパイルしているためです。また、すべてのオブジェクトファイルをリンクすることに関連する小さなオーバーヘッドもあります。

于 2012-10-11T19:50:31.740 に答える
0

変更を加えるたびにシバン全体を再コンパイルするのではなく、ビルドシステム(CMakeやGNU Makeなど)を使用してインクリメンタルビルドを実行します。

Pimplイディオムは、クラスのプライベートメンバーが原因で、ヘッダーファイルにインクルードする必要のある「セカンダリ」ヘッダーファイルの数を減らすのに役立ちます。このイディオムによって完全な再構築の時間が短縮されるとは思いませんが、クラスのプライベートメンバーを変更するときに、増分ビルドの時間を短縮するのに役立つはずです。

ライブラリまたはパッケージの表示可能なインターフェイスの一部であるクラスにPimplを使用するのが好きです。「内部」クラス、または値型として機能するクラスについては、Pimplを気にしません。

于 2012-10-11T20:34:35.730 に答える