24

プリコンパイル済みヘッダーは、大規模なプロジェクトで多くの時間を節約できるように見えますが、いくつかの落とし穴があるお尻の痛みでもあるようです。

プリコンパイル済みヘッダーを使用することの長所と短所は何ですか?具体的には、Gnu / gcc / Linux環境での使用に関連していますか?

4

6 に答える 6

10

プリコンパイル済みヘッダーの唯一の潜在的な利点は、ビルドが遅すぎる場合、プリコンパイル済みヘッダーがそれらを高速化する可能性があることです。潜在的な短所:

  • 正しくするためのMakefileの依存関係の増加。それらが間違っている場合、あなたは間違ったものを素早く構築します。良くない。

  • 原則として、すべてのヘッダーをプリコンパイルできるわけではありません。(#includeの前にいくつかの#defineを置くことを考えてください。)では、gccは実際にどのケースで正しいのでしょうか?この最先端の機能をどれだけ信頼したいですか。

ビルドが十分に高速である場合、プリコンパイル済みヘッダーを使用する理由はありません。ビルドが遅すぎる場合は、

  • 給与に比べて安い、より高速なハードウェアを購入する

  • AT&T nmakeccache(Dirkが正しい)のようなツールを使用します。どちらも信頼できる手法を使用して再コンパイルを回避します。

于 2009-08-27T21:11:50.263 に答える
8

GNU / gcc / linuxと話すことはできませんが、vs2005でプリコンパイル済みヘッダーを処理しました。

長所:

  • 多くのモジュールに含まれる大きなヘッダーがある場合に、コンパイル時間を節約します。
  • 非常にまれにしか変更されないヘッダー(たとえば、サードパーティからのもの)でうまく機能します。

短所:

  • 大きく変化するヘッダーに使用すると、コンパイル時間が長くなる可能性があります。
  • セットアップと保守が面倒な場合があります。
  • プリコンパイル済みヘッダーを強制的にコンパイルしないと、ヘッダーへの変更が明らかに無視される場合があります。
于 2009-08-27T20:56:41.060 に答える
5

gcc、g ++、gfortran、...へのccacheキャッシングフロントエンドは私にとって素晴らしい働きをします。そのウェブサイトが言うように

ccacheはコンパイラキャッシュです。これは、C / C ++コンパイラーのキャッシング・プリプロセッサーとして機能し、-Eコンパイラー・スイッチとハッシュを使用して、キャッシュからコンパイルが満たされる時期を検出します。これにより、一般的なコンパイルで5〜10倍のスピードアップが得られることがよくあります。

Debian / Ubuntuでは、' 'を実行し、たとえば、を指す名前でapt-get install ccacheソフトリンクを作成します。/usr/local/bingccg++gfortranc++/usr/bin/ccache

[編集]いくつかの初期のコメントに応じてこれをより明確にするために:これは、コンパイルステップのより大きなチャンクをキャッシュすることによって、本質的にプリコンパイル済みヘッダーとソースを提供します。そのため、プリコンパイル済みヘッダーに似たアイデアを使用して、さらにそれを実行します。スピードアップは劇的なものになる可能性があります-ウェブサイトが言うように5から10倍。

于 2009-08-27T20:54:44.340 に答える
4

プレーンCの場合、プリコンパイル済みヘッダーは避けます。あなたが言うように、それらは潜在的に問題を引き起こす可能性があり、前処理時間は通常のコンパイルと比較して本当に短いです。

C ++の場合、プリコンパイル済みヘッダーは、コンパイルに費用がかかる大きなテンプレートコードを含むことが多いため、多くの時間を節約できる可能性があります。私はそれらについて実際的な経験がないので、プロジェクトでどれだけのコンパイルの節約が得られるかを測定することをお勧めします。そのためには、プリコンパイル済みヘッダーを使用してプロジェクト全体を1回コンパイルしてから、1つのオブジェクトファイルを削除し、そのファイルの再コンパイルにかかる時間を測定します。

于 2009-08-27T20:57:42.680 に答える
4

GNU gccのドキュメントでは、プリコンパイル済みヘッダーで発生する可能性のある落とし穴について説明しています。

于 2009-08-27T21:33:22.653 に答える
0

ビルドシステムとしてcmakeを使用するQtプロジェクトでPCHを使用していますが、これにより多くの時間を節約できます。PCH cmakeスクリプトをいくつか入手しました。これらはかなり古いため、微調整が必​​要でしたが、通常、予想よりもセットアップが簡単でした。私は付け加えなければなりません、私はcmakeの専門家ではありません。

Qtの大部分(QtCore、QtGui、QtOpenGL)といくつかの安定したヘッダーを一度に含めています。

長所:

  • Qtクラスの場合、前方宣言は必要ありません。もちろん、インクルードはありません。
  • 速い。
  • セットアップが簡単。

短所:

  • PCHインクルードをヘッダーに含めることはできません。これはそれほど問題ではありませんが、Qtを使用し、ビルドシステムにmocファイルを個別に変換させる場合を除きます。これは、たまたま私の構成です。この場合、mocsはヘッダーから生成されるため、ヘッダーにqtヘッダーを#includeする必要があります。解決策は、ヘッダーの#includeの周りに追加のインクルードガードを配置することでした。
于 2009-08-27T21:14:40.647 に答える