約 5.7 MB の C++ ファイルをコンパイルしようとしています。64 ビット Linux システムで 64 ビット Linux 実行可能ファイルをビルドしています。g++ 4.7.2 は残念ながら非協力的です:
g++: internal compiler error: Killed (program cc1plus)
で観察するとtop
、それが起こる前に、プロセスが約 2.2 ギガのメモリに達していることがわかります。設定--param gcc-min-expand=0
して遊んでみまし--param gcc-min-heapsize
たが、問題は解決しませんでした。で最適化を無効にし-O0
ても、どちらも役に立ちませんでした。
また、clang でコンパイルしてみましたが、結果は同様でした。2ギガのメモリも超えた後、セグメンテーションフォールトしました。私はそれにあまり慣れていないので、clang で追加のオプションを試しませんでした。
問題のソース ファイルは、いくつかのマップの C++11 スタイルの初期化で構成されています。
typedef std::map<std::string, int> StringToIntMap;
StringToIntMap someData = {{"SOMESTRING", 1}, ..};
私が望むのは、できればファイルを gcc でコンパイルすることですが、clang が代わりに機能する場合は、それを使用することもできます。内部を知っている人から、舞台裏で何が起こっているのかを知ることも役に立ちます。文字列の長さが約 5 バイトで、それぞれに対応する 300,000 要素のマップがある場合int
、それは数メガバイトのデータであり、イニシャライザがそれをどのようにしてギガバイトを必要とするところまで爆破するかを容易に想像することはできません。コンパイル。
そして、私がそのような大きなソースファイルを持つべきではないというコメントを先取りするために。実行時にデータ ファイルからデータを読み取ることができることはわかっています。それが現在のプログラムの動作ですが、私のユース ケースでは、プログラムの実行時間が最も重要な要素となります。