MSVC отказывается от тяжелого кода шаблона с «фатальной ошибкой C1060: компилятору не хватает места в куче» - PullRequest
3 голосов
/ 06 января 2011

Я пытаюсь скомпилировать некоторый относительно тяжелый код шаблона с помощью MSVC (2010), и он в итоге завершается с fatal error C1060: compiler is out of heap space.

Все это всего лишь одна единица перевода, и, в сравнении, gcc обрабатываетэто довольно легко (внутри виртуальной машины, со значительно меньшим количеством ресурсов).

Любые подсказки, что искать?Существуют ли какие-либо параметры компилятора?

Ответы [ 5 ]

0 голосов
/ 18 октября 2014

У меня была похожая проблема (также перегруженная шаблоном), и я уже использовал /Zm1000 для компиляции своего кода (который работал изначально). Однако после очистки кода, деления длинных функций на более мелкие, размещения чего-либо в пространствах имен и т. Д. Компилятор выдаст сообщение об ошибке:

фатальная ошибка C1060: компилятору не хватает места в куче.

сразу после запуска, без каких-либо задержек (на самом деле ничего не компилируется). Сначала я был смущен, поскольку у меня есть 32 ГБ пространства подкачки, и в то время использовалось только около 6,1 ГБ. Я также использую операционную систему x64, поэтому для всех должно быть достаточно памяти и подкачки.

Я сослался на MSDN и обнаружил, что мне действительно нужно было понизить до /Zm800, и теперь это прекрасно работает. Насколько я понимаю, что использование всего пространства кучи для предварительно скомпилированного буфера заголовка фактически блокирует пространство памяти; поэтому использование /Zm2000 оставит 32-битный компилятор без средств для динамического выделения памяти для других вещей (которые ему так или иначе нужны, что делает опцию /Zm совершенно нелепой - используйте с осторожностью).

Я использую MSVC 6.0, но надеюсь, что это поможет и в 2010 году.

0 голосов
/ 18 марта 2013

На случай, если кто-нибудь столкнется с этой проблемой, вот возможное решение:

Одной из возможных причин этой ошибки является то, что cl.exe сталкивается с ограничением памяти приложения в 2 гигабайта в 32-разрядной версии Windows. Обычно Windows разделяет адресное пространство на 4 гигабайта прямо посередине, давая 2 гигабайта операционной системе и 2 гигабайта приложению. Вместо этого вы можете изменить это на 1/3. В Windows 7 и Vista выполните в командной строке от имени администратора следующие параметры:

bcdedit / set IncreaseUserVa 3072

Затем перезагрузите компьютер. Теперь у MSVC есть 3 гигабайта вместо 2.

Это позволило мне скомпилировать проект, который не удался из-за ошибки C1060. Согласно Resource Monitor, cl.exe занимал чуть более 2 гигабайт памяти. Сбой при обычном расположении адресного пространства.

Ограничение ОС до 1 гигабайта может отрицательно сказаться на производительности при повседневном использовании компьютера. Чтобы изменить разделение на 2/2, выполните следующее:

bcdedit / deletevalue IncreaseUserVa

0 голосов
/ 06 января 2011

См. эту страницу для возможного решения с опцией компилятора / Zm, как предложил Мордачай. Вместо того, чтобы использовать более высокий предел для предварительно скомпилированного заголовка, вы можете попробовать уменьшить его, чтобы в системе было больше доступной свободной памяти.

0 голосов
/ 18 ноября 2011

Мне удалось устранить ошибку 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 >>>.
0 голосов
/ 06 января 2011

Вы могли бы быть в состоянии противостоять этому, явно добавив параметр / Zm к параметрам C / C ++ вашего проекта.например, / Zm256

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...