MSVC放弃模板重代码“致命错误C1060:编译器超出堆空间”

时间:2011-01-05 22:11:38

标签: c++ visual-c++ templates compiler-errors ice

我正在尝试使用MSVC(2010)编译一些相对模板的重型代码,并最终退出fatal error C1060: compiler is out of heap space

整个过程只是一个翻译单元,而且,在比较中,gcc非常容易处理它(在VM内部,资源显着减少)。

任何提示要寻找什么?是否有相关的编译器选项?

5 个答案:

答案 0 :(得分:0)

可能能够通过将/ Zm选项显式添加到项目的C / C ++选项来解决此问题。例如/ Zm256

答案 1 :(得分:0)

有关使用/ Zm编译器选项的可能解决方案,请参阅this页面,如Mordachai建议的那样。 您可能希望尝试降低预编译头,而不是使用预编译头的更高限制,因此系统可以使用更多可用内存。

答案 2 :(得分:0)

通过减少模板上的模板参数数量,我能够通过适度的模板代码解决C1060错误。例如,如果Foo需要三种类型:

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&LT;类型串&LT; int,TypeList&lt; char,TypeList&lt; bool,NullType&gt; &GT; &GT; &GT;

答案 3 :(得分:0)

如果有人遇到这个问题,这是一个可能的解决方案:

此错误的一个潜在原因是cl.exe与32位版本的Windows中的2 gig应用程序内存限制相冲突。通常情况下,Windows会在中间分割4个gig地址空间,为操作系统提供2个演出,为应用程序提供2个演出。您可以将其更改为1/3分割。在Windows 7和Vista上,以管理员身份在命令提示符中运行以下命令:

  

bcdedit / set IncreaseUserVa 3072

然后重新启动计算机。现在MSVC有3个工作而不是2.

这样做只允许我编译因错误C1060而失败的项目。根据资源监视器,cl.exe消耗的内存超过2 gig。在常规地址空间安排下它会失败。

将操作系统限制为1 gig会对计算机日常使用期间的性能产生负面影响。要将拆分更改回2/2,请运行以下命令:

  

bcdedit / deletevalue IncreaseUserVa

答案 4 :(得分:0)

我有一个类似的问题(也是模板重),我已经使用/Zm1000编译我的代码(最初工作)。但是,在清理代码,将长函数分成较小的函数,将东西放入命名空间等之后,编译器会吐出错误消息:

  

致命错误C1060:编译器没有堆空间。

启动后,没有任何延迟(实际上似乎没有编译任何东西)。起初,我很困惑,因为我有32 GB的交换空间,当时只使用了大约6.1 GB。我也在运行x64操作系统,所以每个人都应该有足够的内存和交换。

我提到了MSDN并发现我确实需要降低/Zm800,现在效果很好。我的理解是占用预编译头缓冲区的所有堆空间实际上会锁定内存空间;因此,使用/Zm2000将使32位编译器无法为其他内容动态分配内存(它在某种程度上也需要它,使/Zm选项完全荒谬 - 谨慎使用)。

我使用的是MSVC 6.0,但我希望这在2010年也会有所帮助。