Все компиляторы C ++ имеют одну серьезную проблему с производительностью. Компиляция кода C ++ - это долгий, медленный процесс.
Компиляция заголовков, включенных поверх файлов C ++, - это очень длинный, медленный процесс. Компиляция огромных структур заголовков, которые составляют часть Windows API и других больших библиотек API, - это очень , очень длинный, медленный процесс. Необходимость делать это снова и снова и снова для каждого исходного файла Cpp - это смертельный звон.
Это не уникально для Windows, но это старая проблема, с которой сталкиваются все компиляторы, которые должны компилироваться с большим API, таким как Windows.
Компилятор Microsoft может решить эту проблему с помощью простого трюка, называемого precompiled headers . Хитрость довольно проста: хотя каждый CPP-файл может потенциально и юридически придать немного иной смысл цепочке заголовочных файлов, включенных в начало каждого Cpp-файла (такими вещами, как наличие разных макросов # define'd перед включениями, или включив заголовки в другом порядке), это чаще всего не так. В большинстве случаев у нас есть десятки или сотни включенных файлов, но все они имеют одинаковое значение для всех файлов Cpp, компилируемых в вашем приложении.
Компилятор может значительно сэкономить время, если ему не нужно начинать компилировать каждый файл Cpp, а также десятки включений буквально с нуля каждый раз.
Хитрость заключается в назначении специального заголовочного файла в качестве отправной точки всех цепочек компиляции, так называемого файла «предварительно скомпилированного заголовка», который обычно является файлом с именем stdafx.h просто по историческим причинам.
Просто перечислите все ваши большие огромные заголовки для ваших API в файле stdafx.h в соответствующем порядке, а затем начните каждый из ваших файлов CPP с самого верха с #include "stdafx.h"
перед любым значимым контентом (примерно единственное, что разрешено раньше, это комментарии).
В этих условиях вместо запуска с нуля компилятор начинает компилирование из уже сохраненных результатов компиляции всего в stdafx.h
.
Я не верю, что этот трюк уникален для компиляторов Microsoft, и при этом я не думаю, что это была оригинальная разработка.
Для компиляторов Microsoft настройка, управляющая использованием предварительно скомпилированных заголовков, контролируется аргументом командной строки для компилятора: /Yu "stdafx.h"
. Как вы можете себе представить, использование имени файла stdafx.h
- это просто соглашение; Вы можете изменить имя, если хотите.
В Visual Studio 2010 этот параметр управляется из графического интерфейса пользователя посредством щелчка правой кнопкой мыши по проекту CPP, выбора «Свойства» и перехода к «Свойства конфигурации \ C / C ++ \ Precompiled Headers». Для других версий Visual Studio расположение в графическом интерфейсе будет другим.
Обратите внимание: если вы отключите предварительно скомпилированные заголовки (или запустите свой проект с помощью инструмента, который их не поддерживает), это не сделает вашу программу незаконной; это просто означает, что ваш инструмент будет каждый раз компилировать все с нуля.
Если вы создаете библиотеку без зависимостей Windows, вы можете легко закомментировать или удалить #include из файла stdafx.h. Нет необходимости удалять файл как таковой, но, очевидно, вы также можете сделать это, отключив вышеуказанный параметр заголовка прекомпиляции.