4

ショートストーリー:

gcc-cオプションでプリコンパイル済みヘッダーを正しく動作させることができません。

長い話:

皆さん、私はLinuxでgcc-4.4.1を使用していて、非常に大きなプロジェクトでプリコンパイル済みヘッダーを試す前に、単純なプログラムでそれらをテストすることにしました。彼らは「ちょっとうまくいく」が、私は結果に満足しておらず、私のセットアップに何か問題があると確信している。

まず最初に、それらがまったく機能するかどうかをテストするための簡単なプログラム(main.cpp)を作成しました。

#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/type_traits.hpp>

int main()
{
  return 0;
}

次に、プリコンパイル済みヘッダーファイルpre.h(同じディレクトリ内)を次のように作成しました。

#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/type_traits.hpp>

...そしてそれをコンパイルしました:

$ g++ -I. pre.h

(pre.h.gchが作成されました)

その後、プリコンパイル済みヘッダーがある場合とない場合のコンパイル時間を測定しました。

pch付き

$ time g++ -I. -include pre.h main.cpp

real    0m0.128s
user    0m0.088s
sys  0m0.048s

pchなし

$ time g++ -I. main.cpp 

real    0m0.838s
user    0m0.784s
sys  0m0.056s

ここまでは順調ですね!ほぼ7倍速く、それは印象的です!それでは、もっと現実的なことを試してみましょう。私のすべてのソースは-cオプションで構築されており、何らかの理由でpchをうまく再生させることができません。以下の手順でこれを再現できます...

次のようにテストモジュールfoo.cppを作成しました。

#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/type_traits.hpp>

int whatever()
{
  return 0;
}

pchを使用した場合と使用しない場合でモジュールfoo.cppをビルドしようとしたタイミングは次のとおりです。

pch付き

$ time g++ -I. -include pre.h -c foo.cpp 

real    0m0.357s
user    0m0.348s
sys 0m0.012s

pchなし

$ time g++ -I. -c foo.cpp 

real    0m0.330s
user    0m0.292s
sys 0m0.044s

それはかなり奇妙で、まったくスピードアップがないように見えます!(私はタイミングを数回実行しました)。この場合、プリコンパイル済みヘッダーがまったく使用されていないことが判明しました。-Hオプションでチェックしました(「g++-I。-includepre.h-cfoo.cpp-H」の出力にはpre.hが表示されませんでした。まったくgch)。

私は何が間違っているのですか?

4

1 に答える 1

8

わかりました、解決策を見つけたと思います: -fpch-preprocessは-cオプションと一緒に使用する必要があります。それは魅力のように機能します!

タイミングは次のとおりです。

pch付き

$ time g++ -I. -include pre.h -c foo.cpp -fpch-preprocess

real    0m0.028s
user    0m0.016s
sys 0m0.016s

pchなし

$ time g++ -I. -c foo.cpp 

real    0m0.330s
user    0m0.292s
sys 0m0.044s

更新: gcc ヘルプ メーリング リストで同じ質問をしたところ、Ian Lance Taylor が distcc/ccache の使用によるこの奇妙な動作について説明してくれました。これらのツールは、最初にソースを前処理するため、このオプションが必要になります。

于 2010-03-27T21:41:23.500 に答える