Сбой оптимизации всей программы в VC2008 - PullRequest
9 голосов
/ 02 марта 2011

У меня достаточно большая программа на C ++ (~ 11mb exe), скомпилированная под VS2008, и мне было интересно посмотреть, сильно ли оптимизация всей программы сильно повлияет на ее производительность.Однако включение оптимизации всей программы и генерации временного кода канала приводит к сбою ссылки следующим образом:

1>c:\cpp\Win32\Atlas\tin\TINDoc.Cpp : fatal error C1083: Cannot open compiler intermediate file: '.\releaseopt\TINDoc.obj': Not enough space
1>LINK : fatal error LNK1257: code generation failed

Глядя на диспетчер задач, я вижу, что компоновщик использует все больше и больше памяти, пока он не иссякнет, и бомбыиз.Компилятор работает на XP 32bit с 2 ГБ или оперативной памяти и 2 ГБ файла подкачки.Ограничено ли WPO меньшими приложениями и / или более крупными средами, или есть какой-то способ заставить компоновщик быть более экономным в использовании памяти.

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

Редактировать: Работает под VS2010, хотя и без предварительно скомпилированных заголовков, но прирост производительности неэто важно.Я оставлю эту опцию в покое, пока не перейду на более мощную 64-битную платформу с более надежной версией VS2010.

Ответы [ 2 ]

5 голосов
/ 12 марта 2011

VC2008 - хрупкий зверь.Оптимизатор просто не работает в некоторых случаях, и, похоже, у вас может быть один такой случай.

Примеры "не работает" включают

  • Дезоптимизированный код (медленно!)
  • Сбой компилятора или (более часто) компоновщика
  • Неясные сообщения об ошибках компиляции / ссылки
  • Неправильное выполнение кода (это редко, но не неизвестно).

На самом деле, если вы посмотрите на некоторые приемы, используемые современными оптимизаторами, то удивительно, что они работают так же часто, как и.Сложность довольно поразительна.

Конкретное решение проблемы Шейна, некоторые вещи, которые могут вызвать вашу ошибку:

  1. Недостаток файловых дескрипторов был большой проблемой в DOSи ранние версии Windows.Вы вряд ли когда-либо увидите это в современных версиях Windows.Я даже не уверен, что все еще существует ограничение на дескрипторы файлов.

  2. Ошибка компилятора может привести к бесконечному циклу, означающему, что никакого количества ресурсов будет недостаточно.

  3. Рекурсивный файл включения также может вызывать нечто подобное.У всех ваших включаемых файлов есть "#pragma once" или "#if !defined(FOO_INCLUDED)"?

  4. Возможно, вы включили файл TINDoc.obj в проект дважды?Компилятор 2008 агрессивно многопоточный, и между двумя потоками, пытающимися получить доступ к файлу, может возникнуть конфликт.На самом деле это может произойти из-за ошибки компилятора, даже если вы не включили файл дважды.

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

Не думайте об этом, потому что там написано "недостаточно места", что должно быть причиной.Некоторые программы (включая некоторые компиляторы) вместо проверки будут угадывать причину ошибки.

Вы можете отслеживать использование памяти, дескрипторов и т. Д. С помощью диспетчера задач или perfmon или (мои предпочтения) Process Explorer

Я уже разместилпервая часть этого как комментарий (выше), но я делаю это ответом, как предложил Бен (http://stackoverflow.com/users/587803/ben) - и несколько расширил его.

3 голосов
/ 11 марта 2011

Вы можете попробовать загрузить XP с помощью переключателя / 3G , чтобы дать компоновщику адресное пространство 3 ГБ.В Vista / 7 используйте BCDEDIT /Set IncreaseUserVa 3072 в командной строке, чтобы получить тот же эффект.

Исправлены проблемы с созданием .ilk-файлов для меня.

...