3

MSVC(2010)を使用して比較的テンプレートの重いコードをコンパイルしようとしていますが、最終的にはで終了しfatal error C1060: compiler is out of heap spaceます。

全体が1つの変換ユニットであり、比較すると、gccはそれを非常に簡単に処理します(VM内で、リソースが大幅に少なくなります)。

何を探すべきかについてのヒントはありますか?関連するコンパイラオプションはありますか?

4

5 に答える 5

0

テンプレートのテンプレート引数の量を減らすことで、中程度のテンプレートコードで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;

専門化が必要な場合は、次のことを検討してください。

  • 特殊な動作をポリシーにプッシュし、それらから継承します。
  • 引数リストで専門にする必要のある引数を保持します。
  • タイプをタイプリストにチェーンします。Foo <TypeList <int、TypeList <char、TypeList <bool、NullType>>>>>。
于 2011-11-18T15:32:24.753 に答える
0

プロジェクトの C/C++ オプションに /Zm オプションを明示的に追加することで、これに対抗できる場合があります。例 /Zm256

于 2011-01-05T22:16:20.497 に答える
0

Mordachai が提案したように、/Zm コンパイラ オプションを使用した可能な解決策については、このページを参照してください。プリコンパイル済みヘッダーに高い制限を使用する代わりに、それを下げて、システムがより多くの空きメモリを使用できるようにすることをお勧めします。

于 2011-01-05T22:30:59.630 に答える
0

誰かがこの問題に遭遇した場合、考えられる解決策は次のとおりです。

このエラーの潜在的な原因の 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

于 2013-03-18T15:59:12.840 に答える
0

同様の問題があり(テンプレートが多い)、すでに/Zm1000コードをコンパイルするために使用していました(最初は機能していました)。ただし、コードをクリーンアップし、長い関数をより小さな関数に分割し、名前空間などに配置した後、コンパイラはエラーメッセージを吐き出します:

致命的なエラー C1060: コンパイラのヒープ領域が不足しています。

開始直後、遅滞なく(実際には何もコンパイルしていないようです)。32 GB のスワップ領域があり、その時点で約 6.1 GB しか使用されていなかったので、最初は戸惑いました。私も x64 OS を実行しているので、全員に十分なメモリとスワップが必要です。

私はMSDNを参照し、実際に下げる必要があることを知り/Zm800、今ではうまく機能しています. 私の理解では、プリコンパイル済みヘッダー バッファー用にすべてのヒープ スペースを占有すると、実際にはメモリ スペースがロックアウトされます。そのため、使用/Zm2000すると、他のものにメモリを動的に割り当てる手段がなく、32ビットコンパイラが残ります(これも何らかの形で必要になるため、/Zmオプションは完全にばかげています-注意して使用してください)。

私は MSVC 6.0 を使用していますが、これが 2010 年にも役立つことを願っています。

于 2014-10-18T10:27:19.800 に答える