MSVC(2010)を使用して比較的テンプレートの重いコードをコンパイルしようとしていますが、最終的にはで終了しfatal error C1060: compiler is out of heap space
ます。
全体が1つの変換ユニットであり、比較すると、gccはそれを非常に簡単に処理します(VM内で、リソースが大幅に少なくなります)。
何を探すべきかについてのヒントはありますか?関連するコンパイラオプションはありますか?
MSVC(2010)を使用して比較的テンプレートの重いコードをコンパイルしようとしていますが、最終的にはで終了しfatal error C1060: compiler is out of heap space
ます。
全体が1つの変換ユニットであり、比較すると、gccはそれを非常に簡単に処理します(VM内で、リソースが大幅に少なくなります)。
何を探すべきかについてのヒントはありますか?関連するコンパイラオプションはありますか?
テンプレートのテンプレート引数の量を減らすことで、中程度のテンプレートコードでC1060エラーを解決することができました。たとえば、Fooが3つのタイプを期待している場合:
template< typename T1, typename T2, typename T3 > struct Foo
{
T1 t1;
T2 t2;
T3 t3;
};
Foo< int, char, bool > foo;
次に、型を単一の構造体にカプセル化し、その構造体を引数として使用します。
template< typename T_ARG > struct Foo
{
typename T_ARG::T1 t1;
typename T_ARG::T2 t2;
typename T_ARG::T3 t3;
};
struct FooArgs
{
typedef int T1;
typedef char T2;
typedef bool T3;
};
Foo< FooArgs > foo;
専門化が必要な場合は、次のことを検討してください。
プロジェクトの C/C++ オプションに /Zm オプションを明示的に追加することで、これに対抗できる場合があります。例 /Zm256
Mordachai が提案したように、/Zm コンパイラ オプションを使用した可能な解決策については、このページを参照してください。プリコンパイル済みヘッダーに高い制限を使用する代わりに、それを下げて、システムがより多くの空きメモリを使用できるようにすることをお勧めします。
誰かがこの問題に遭遇した場合、考えられる解決策は次のとおりです。
このエラーの潜在的な原因の 1 つは、cl.exe が 32 ビット バージョンの Windows で 2 GB のアプリケーション メモリ制限にぶつかっていることです。通常、Windows は 4 ギガのアドレス空間を真ん中で分割し、OS に 2 ギガ、アプリケーションに 2 ギガを割り当てます。代わりに 1/3 分割に変更できます。Windows 7 および Vista では、管理者としてコマンド プロンプトで次を実行します。
bcdedit /set IncreaseUserVa 3072
次に、コンピューターを再起動します。現在、MSVC には 2 つではなく 3 つのギグがあります。
そうすることで、エラー C1060 が原因で失敗していたプロジェクトをコンパイルできるようになりました。リソース モニターによると、cl.exe は 2 GB をわずかに超えるメモリを消費していました。通常のアドレス空間配置では失敗していたでしょう。
OS を 1 ギガに制限すると、コンピューターを日常的に使用する際のパフォーマンスに悪影響を与える可能性があります。分割を 2/2 に戻すには、次を実行します。
bcdedit /deletevalue IncreaseUserVa
同様の問題があり(テンプレートが多い)、すでに/Zm1000
コードをコンパイルするために使用していました(最初は機能していました)。ただし、コードをクリーンアップし、長い関数をより小さな関数に分割し、名前空間などに配置した後、コンパイラはエラーメッセージを吐き出します:
致命的なエラー C1060: コンパイラのヒープ領域が不足しています。
開始直後、遅滞なく(実際には何もコンパイルしていないようです)。32 GB のスワップ領域があり、その時点で約 6.1 GB しか使用されていなかったので、最初は戸惑いました。私も x64 OS を実行しているので、全員に十分なメモリとスワップが必要です。
私はMSDNを参照し、実際に下げる必要があることを知り/Zm800
、今ではうまく機能しています. 私の理解では、プリコンパイル済みヘッダー バッファー用にすべてのヒープ スペースを占有すると、実際にはメモリ スペースがロックアウトされます。そのため、使用/Zm2000
すると、他のものにメモリを動的に割り当てる手段がなく、32ビットコンパイラが残ります(これも何らかの形で必要になるため、/Zm
オプションは完全にばかげています-注意して使用してください)。
私は MSVC 6.0 を使用していますが、これが 2010 年にも役立つことを願っています。