3

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

整个事情只是一个翻译单元,相比之下,gcc 很容易处理它(在 VM 内,资源显着减少)。

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

4

5 回答 5

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< TypeList< int, TypeList< char, TypeList< bool, NullType > > > >。
于 2011-11-18T15:32:24.753 回答
0

万一有人遇到这个问题,这里有一个可能的解决方案:

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

bcdedit /set 增加用户Va 3072

然后重新启动计算机。现在 MSVC 有 3 个 gig 可供使用,而不是 2 个。

这样做只是让我编译了一个由于错误 C1060 而失败的项目。根据 Resource Monitor,cl.exe 消耗的内存略高于 2 gig。在常规地址空间安排下它会失败。

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

bcdedit /deletevalue 增加UserVa

于 2013-03-18T15:59:12.840 回答
0

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

于 2011-01-05T22:16:20.497 回答
0

如 Mordachai 所建议的,请参阅此页面以了解使用 /Zm 编译器选项的可能解决方案。您可能想尝试降低它,而不是对预编译头使用更高的限制,以便系统有更多的可用内存。

于 2011-01-05T22:30:59.630 回答
0

我有一个类似的问题(也是大量模板),并且我已经在使用/Zm1000它来编译我的代码(最初可以工作)。但是,在清理代码、将长函数划分为更小的函数、将内容放入命名空间等之后,编译器会吐出错误消息:

致命错误 C1060:编译器堆空间不足。

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

我参考了MSDN,发现我实际上需要降低/Zm800现在它工作得很好。我的理解是,为预编译的头缓冲区占用所有堆空间实际上锁定了内存空间;因此使用/Zm2000将使 32 位编译器无法为其他东西动态分配内存(它也需要它,使该/Zm选项完全荒谬 - 谨慎使用)。

我正在使用 MSVC 6.0,但我希望这对 2010 年也有帮助。

于 2014-10-18T10:27:19.800 回答