C3859 не удалось создать виртуальную память для pch

Обновлено: 03.07.2024

But currently, there are two problems with this:

Why does it not occur every time I do a rebuild? If I understand correctly, the compiler ran out of memory while compiling my project. So if I do a rebuild, which cleans all prior work, shouldn't it run out of memory the next time too, if I don't change anything?

To be on the safe side, I already have specified a value of 120 for Zm (ie Zm120 ) in all configurations of this project. Why do I get an error message with this lower value? Or is the suggested value of 114 just a wild guess of VS?

2 answers

Просто пробил в с тем, что решение в конечном итоге быть для меня. Похоже, что Visual Studio пытается скомпилировать свою программу для нескольких архитектур, несмотря на меня думать, что я удалила профили, была кучей фиктивных записей в менеджере конфигурации для построения в режиме x86. Они были бесполезны для меня, так как я хочу построить в x64 только. После удаления этих записей, исчезли программа составлена ​​снова и эта ошибка. Надеюсь, что это поможет кому-то.

Я знаю, что это старый, но я оказался здесь, так что я мог бы также ответить.

Существует большая статья о проблемах PCH здесь .

1) Почему это не происходит каждый раз , когда я пересобрать?
Это немного сложно ответить , конечно. Так как это не происходит каждый раз, это может быть несколько вопросов. Это, скорее всего , из - за выделение памяти. Из статьи:

  • Дробление диапазона адресов виртуальной памяти (ов) , требуемый PCH перед тем cl.exe может загрузить его в память.
  • Отказ ОС Windows при больших нагрузках, чтобы увеличить размер файла подкачки в пределах определенного порогового значения времени.

c1xx: ошибка C3859: Не удалось создать виртуальную память для PCH [. Project.vcxproj] c1xx: обратите внимание: система возвращает код 1455: Файл подкачки слишком мал для завершения операции

Это также может помочь установить PreferredToolArchtecture на x64:

Если вы используете MSBuild из командной строки вы можете передать / р: PreferredToolArchtecture = x64 для MSBuild. Если вы строите с MSBuild изнутри Visual Studio, вы можете отредактировать файл .vcxproj включить PropertyGroup, содержащий этот объект.

Это один легко не заметить, но те родов проблемы также случаются, когда предкомпилированный заголовок слишком велик. Ведение мало очистки может быть хорошей идеей, как хорошо.

Но в настоящее время с этим есть две проблемы:

Почему это не происходит каждый раз , когда я выполняю перестройку? Если я правильно понимаю, компилятору не хватило памяти при компиляции моего проекта. Итак, если я сделаю перестройку, которая очистит всю предыдущую работу, не должна ли она исчерпать память в следующий раз, если я ничего не изменю?

4 ответа

Я знаю, что это старый, но я оказался здесь, так что могу ответить.

Есть отличная статья о проблемах PCH здесь.

1) Почему это не происходит каждый раз, когда я выполняю перестройку?
Конечно, на этот вопрос сложно ответить. Поскольку это происходит не каждый раз, может быть несколько проблем. Скорее всего, это связано с выделением памяти. Из статьи:

  • Фрагментация диапазонов адресов виртуальной памяти, необходимых для PCH перед CL.EXE сможет загрузить его в память.
  • Отказ ОС Windows при больших нагрузках увеличить размер файла подкачки в течение определенного порогового времени.

c1xx: ошибка C3859: не удалось создать виртуальную память для PCH [. Project.vcxproj] c1xx: примечание: система вернула код 1455: файл подкачки слишком мал для завершения этой операции

Также может помочь установить PreferredToolArchtecture на x64:

Если вы используете MSBuild из командной строки, вы можете передать / p: PreferredToolArchtecture = x64 в MSBuild. Если вы создаете с помощью MSBuild из Visual Studio, вы можете отредактировать файл .vcxproj, включив в него PropertyGroup, содержащую это свойство.

Это легко упустить из виду, но такие проблемы также возникают, когда предварительно скомпилированный заголовок слишком велик. Также неплохо было бы провести небольшую уборку.

Просто вмешиваюсь в то, чем оказалось решение для меня. Похоже, что Visual Studio пыталась скомпилировать мою программу для нескольких архитектур, хотя я думал, что удалил профили, в диспетчере конфигурации была куча фиктивных записей для сборки в режиме x86. Для меня это было бесполезно, так как я хочу собирать только x64. После удаления этих записей программа снова скомпилировалась, и эта ошибка исчезла. Надеюсь, это кому-то поможет.

Еще одна причина этой проблемы. Я не совсем понимаю, как проект попал в это состояние, но он пытался использовать файлы PCH, для параметра «Файл предварительно скомпилированного заголовка» было установлено значение pch.h , но параметр «Вывод предварительно скомпилированного заголовка» чуть ниже был пусто.

Неудивительно, но Visual Studio очень сильно разошлась по этому поводу, в частности, выдавая многочисленные ошибки C3859 во время сборки.

Сортировка конфигурации проекта до «Наследовать» это значение исправила его.

Я столкнулся с этим, собирая большую базу кода на локальной виртуальной машине. Пытался увеличить размер файла подкачки и т. Д., Но ничего не вышло. Единственное, что сработало в моем случае, - это отключить динамическую память в настройке виртуальной машины Hyper-V и дать виртуальной машине больше ОЗУ, 8 ГБ -> 16 ГБ.

По-видимому, VS выделяет память заранее, поэтому он использует только начальное значение, данное виртуальной машине, и не запускает никаких изменений динамической памяти.

Но в настоящее время есть две проблемы с этим:

Почему это не происходит каждый раз Я делаю перестройку? Если я правильно понимаю, компилятору не хватило памяти при компиляции моего проекта. Так что, если я сделаю перестройку, которая очищает всю предыдущую работу, разве в следующий раз ей не хватит памяти, если я ничего не изменю?

Решение

Я знаю, что это старо, но я оказался здесь, так что я мог бы ответить.

Есть отличная статья о проблемах PCH Вот .

1) Почему это не происходит каждый раз, когда я делаю перестройку?
Это немного сложно, чтобы ответить наверняка. Так как это происходит не каждый раз, это может быть несколько проблем. Скорее всего, это связано с распределением памяти. Из статьи:

  • фрагментация диапазонов адресов виртуальной памяти, требуемых
    PCH перед CL.EXE может загрузить его в память.
  • Отказ ОС Windows при больших нагрузках увеличить размер файла подкачки за определенный промежуток времени.

Это также может помочь установить PreferredToolArchtecture в x64:

Если вы используете MSBuild из командной строки, вы можете передать / p: PreferredToolArchtecture = x64 в MSBuild. Если вы строите с помощью MSBuild из Visual Studio, вы можете отредактировать файл .vcxproj, включив в него группу PropertyGroup, содержащую это свойство.

Эту проблему легко упустить из виду, но подобные проблемы возникают и тогда, когда предварительно скомпилированный заголовок слишком велик. Небольшая уборка также может быть хорошей идеей.

Другие решения

Просто согласиться с тем, что решение оказалось для меня. Кажется, что Visual Studio пыталась скомпилировать мою программу для нескольких архитектур, несмотря на то, что я думал, что удалил профили, в диспетчере конфигурации была куча поддельных записей для сборки в режиме x86. Это было бесполезно для меня, так как я хочу встроить только в x64. После удаления этих записей программа снова скомпилировалась, и эта ошибка исчезла. Надеюсь, это поможет кому-то.

В моём проекте видимо накопилось очень много шаблонов и внезапно студия перестала его компилировать, выдавая такую ошибку:

2>c1xx : error C3859: превышен диапазон адресов виртуальной памяти для PCH; повторите компиляцию с параметром командной строки "-Zm110" или большим
2>c1xx : fatal error C1076: ограничение компилятора: достигнут предел внутренней кучи; воспользуйтесь /Zm для задания большего значения
Не хотелось бы потакать компилятору и выделять ему больше памяти, поэтому я хочу понять, как оптимизировать шаблоны. Что конкретно нужно пытаться минимизировать? Я не очень понимаю логику реализации шаблонов в компиляторах и не знаю, что занимает память, а что нет. Что важнее экономить - количество инстанциаций или определений шаблона? Предполагаю, что первое, потому что кода в pch у меня всего наверное не больше 1 МБ - там даже стандартной библиотеки нет, только мой код.

На проектах какого размера вы сталкивались\не сталкивались с такой ошибкой?

gammaker
> -Zm

поставь туда 666

innuendo
> поставь туда 666
Так я же написал:
gammaker
> Не хотелось бы потакать компилятору и выделять ему больше памяти

Немного упростил кое-какой макрос, который генерировал шаблонный код и удалось уменьшить значение со 110 до 101. Осталось ещё выжать хотя бы 15 и можно будет расслабиться по этому поводу.

gammaker
у всяких огров шаблон шаблоном погоняет и подобных проблем нет.

кажется, когда такая проблема возникает, можно просто ещё раз нажать f7 и он продолжит компилировать с места, откуда в прошлый раз упал. при переходе с x86 компилятора на x64 эта проблема больше не появлялась.

Suslik
> у всяких огров шаблон шаблоном погоняет и подобных проблем нет.
Не знаю, как у огров, но предполагаю, что у меня хуже. У меня очень много очень сложных SFINAE условий. Сейчас я пытаюсь их упростить и убрать дублирующиеся проверки. И сейчас специально поставил /Zm50, чтобы видеть ошибку даже когда опускаюсь ниже 100. Надо с запасом оптимизировать. Последний раз ему нужен был /Zm96, попробую опустить до чего-нибудь типа /Zm85 и успокоюсь.
Просто не хочется усложнять сборку своей либы необходимостью использования специальных ключей. Да и размер PCH файла неплохо бы сократить, а то со всех конфигураций гигабайты набегают и иногда даже диск переполняется.

gammaker
> Не знаю, как у огров, но предполагаю, что у меня хуже.
знаешь, я не считаю, что запредельные требования к компилятору — это сразу no-go. если пользователь подключает твою либу и она хавает 90% хипа компилятора, в то время как какой-нибудь unreal engine 4 можно подключить и уложиться в какие-нибудь 20% — это, в общем-то, нормально. разумеется, если твоя либа даёт во столько же раз больше возможностей, чем ue4, а не просто сливает кучу памяти из-за говнокода на ровном месте.

Не страдай ерундой, просто ставь побольше. У нас на разных конфигурация /Release/Debug и тд вело себя по-разному

Suslik
> если пользователь подключает твою либу и она хавает 90% хипа компилятора
На момент создания треда у меня было все 110%. На 85-90% я наверное остановлюсь, если не увлекусь конечно. А то в процессе я обнаруживаю некоторые баги в этих SFINAE условиях, которые делают алгоритмы менее обобщёнными, чем они должны быть или даже потенциально могут привести к ошибкам в будущем.

Suslik
> разумеется, если твоя либа даёт во столько же раз больше возможностей, чем ue4
Не знаю, как их тут можно сравнивать, ведь моя либа - не движок. Хотя в будущем движок будет одним из её модулей. Это скорее библиотека обобщённых алгоритмов, во много раз более обобщённых, но при этом удобных, чем в STL и даже Boost. Так как я в будущем хочу переманить на неё как можно больше пользователей STL, важно, чтобы везде всё работало из коробки без танцев с бубном и ключами компилятора.
Но наверное лет через 5, когда выйдет версия 2.0 моей библиотеки с использованием фич будущего стандарта (особенно концептами) и освобождением от кучи костылей, эта проблема наверное уйдёт навсегда.

innuendo
> Не страдай ерундой, просто ставь побольше. У нас на разных конфигурация
> /Release/Debug и тд вело себя по-разному
Вот у меня в релизе работало, а такая ошибка обнаружилась в дебаге. А какой размер у вашего проекта, какую долю в нём составляют хидеры и насколько там страшные шаблоны? Или у вас там используются тяжёлые шаблонные библиотеки? Если так, то какой вклад они вносят?

gammaker
> На проектах какого размера вы сталкивались\не сталкивались с такой ошибкой?
У меня было падение компилятора внутри мега-шаблона))
Была очень долгая компиляция из-за разворачивания рекурсивных шаблонных функций.
Но таких ошибок не было.
Проекты бывало компилились по 30 мин, так что исходников там дохрена.

/A\
> Но таких ошибок не было.
> Проекты бывало компилились по 30 мин, так что исходников там дохрена.
Странно. У меня проект за время около минуты на нетбуке собирается.

У меня тоже SFINAE в коде, исходников где-то 2mb, собираю с /Zm180, компилируется чуть дольше минуты.

gammaker
> Осталось ещё выжать хотя бы 15 и можно будет расслабиться по этому поводу.
кстати, а ты покажи stdafx.h

Возможно достаточно его почистить. оно же ругается что PCH файл слишком большой получается

gammaker
> Предполагаю, что первое, потому что кода в pch у меня всего наверное не больше
> 1 МБ
тебе кажется. этот файл очень быстро растет. и ты можешь не заметить как он будет и 1гб весить и больше (у меня реально такое было когда ковырял чужие движки)

бесплатных фотохостинг

Собственно вот сейчас в моем 2D движке всего 15к кода (суммарно 400кб):

Это в релизе. в дебаге он больше весит.

шаблонов у меня сейчас нет вообще ни одного. и проблема не обязательно будет в шаблонах. там можно случайно stdafx забить кучей инклюдов (включая зависимые)

Но в настоящее время с этим связаны две проблемы:

Почему это не происходит каждый раз , когда я делаю перестройку? Если я правильно понимаю, у компилятора закончилась память во время компиляции моего проекта. Итак, если я сделаю перестройку, которая очистит всю предыдущую работу, не должна ли она закончиться и в следующий раз, если я ничего не изменю?

4 ответа

Сегодня я добавлял некоторые заголовки библиотеки в наш файл precomp.h . Затем я попытался перекомпилировать в debug и получил эти две ошибки (порожденные из boost include): ошибка C3859: диапазон виртуальной памяти для PCH превышен; пожалуйста, перекомпилируйте с параметром командной строки.

У меня есть этот тонкий вопрос о виртуальной памяти. В одной книге я прочитал эту цитату При выполнении файла ELF текст и два сегмента данных загружаются в отдельные области виртуальной памяти Но если мы, например, скомпилируем программу C, состоящую из двух исходных файлов без связывания, она.

Я знаю, что это старо, но я оказался здесь, так что я мог бы также ответить.

Здесь есть отличная статья о проблемах PCH .

1) Почему это не происходит каждый раз, когда я делаю перестройку?
Это немного сложно ответить, конечно. Поскольку это происходит не каждый раз, это может быть несколько проблем. Скорее всего, это связано с выделением памяти. Из статьи :

  • Фрагментация диапазона(диапазонов) адресов виртуальной памяти, требуемых PCH до того, как CL.EXE сможет загрузить его в память.
  • Отказ Windows OS при больших нагрузках увеличить размер файла подкачки в течение определенного порога времени.

c1xx : ошибка C3859: Не удалось создать виртуальную память для PCH [. Project.vcxproj] c1xx: примечание: система вернула код 1455: Файл подкачки слишком мал для завершения этой операции

Это также может помочь установить PreferredToolArchtecture в x64:

Если вы используете MSBuild из командной строки, вы можете передать /p:PreferredToolArchtecture=x64 в MSBuild. Если вы строите с MSBuild из Visual Studio, вы можете отредактировать файл .vcxproj, включив в него PropertyGroup, содержащий это свойство.

Это легко пропустить, но такие проблемы также возникают, когда предварительно скомпилированный заголовок слишком велик. Небольшая уборка тоже может быть хорошей идеей.

Я столкнулся с этим, компилируя большую кодовую базу на локальном VM. Попробовал увеличить размер файла подкачки и т. д., Но ничего не вышло. Единственное, что сработало в моем случае, - это отключить динамическую память в настройках виртуальной машины Hyper-V и дать VM больше RAM, 8 ГБ - > 16 ГБ.

По-видимому, VS выделяет свою память заранее, поэтому он использует только начальное значение, заданное VM, и не вызывает никаких динамических изменений памяти.

Просто вмешиваюсь в то, что решение оказалось для меня. Похоже, что Visual Studio пытался скомпилировать мою программу для нескольких архитектур, несмотря на то, что я думал, что удалил профили, в диспетчере конфигурации была куча фиктивных записей для сборки в режиме x86. Они были бесполезны для меня, так как я хочу строить только в x64. После удаления этих записей программа снова скомпилировалась, и эта ошибка исчезла. Надеюсь, это кому-то поможет.

Еще одна причина этой проблемы. Я не совсем понимаю, как проект попал в такое состояние, но он пытался использовать файлы PCH, имел опцию "Precompiled Header File" , установленную на pch.h , но опция "Precompiled Header Output" чуть ниже была пуста.

На самом деле это не удивительно, но Visual Studio очень сильно разозлился из-за этого, в частности, выбросив многочисленные ошибки C3859 во время сборки.

Сортировка конфигурации проекта до "Inherit" это значение исправило его прямо вверх.

Похожие вопросы:

В linux диапазон адресов виртуальной памяти в пользовательском пространстве, другими словами, диапазон значений, возвращаемых malloc, совпадает со всем 64-битным пространством виртуальной памяти.

система i86-32 бита : Есть ли способ зарезервировать определенный диапазон виртуального адресного пространства в карте памяти процесса, чтобы остановить ld.so (динамический компоновщик) от загрузки.

Предположим, что существует устройство, использующее сопоставленный с памятью ввод-вывод, т. е. существует определенный диапазон физической памяти, назначенный этому устройству Если система.

Сегодня я добавлял некоторые заголовки библиотеки в наш файл precomp.h . Затем я попытался перекомпилировать в debug и получил эти две ошибки (порожденные из boost include): ошибка C3859: диапазон.

У меня есть этот тонкий вопрос о виртуальной памяти. В одной книге я прочитал эту цитату При выполнении файла ELF текст и два сегмента данных загружаются в отдельные области виртуальной памяти Но.

У меня есть размер виртуальной памяти, установленный на 756 MB на windows xp, Но при чтении на msdn он говорит, что виртуальная память для каждого процесса на 32-битном OS по умолчанию равна 4 GB.

Скажем, если в какой-то момент диапазон виртуальной памяти в моем процессе был заблокирован как таковой: //Memory was reserved & committed as such void* pMem = ::VirtualAlloc(NULL, 4096.

Я читал textbook:Computer Systems A Programmer's Perspective в главе 9.7.2:Linux Virtual Memory System (третье издание), в которой говорится о виртуальной памяти. Я был немного смущен структурой.

Читайте также: