Предварительно скомпилированные заголовки (PCH) - это специальные файлы, которые определенные компиляторы могут генерировать для файла .cpp.Это то, что они представляют собой: предварительно скомпилированный исходный кодЭто исходный код, который был передан через компилятор и встроен в формат, зависящий от компилятора.
PCH обычно используются для ускорения компиляции.Вы помещаете обычно используемые заголовки в PCH, а затем просто включаете PCH.Когда вы делаете #include
на PCH, ваш компилятор на самом деле не выполняет обычную работу #include.Вместо этого он загружает эти предварительно скомпилированные символы прямо в компилятор.Нет запуска препроцессора C ++.Нет запуска компилятора C ++.Нет, включая миллион разных файлов.Один файл загружен, и символы кажутся полностью сформированными непосредственно в рабочей области вашего компилятора.
Я упоминаю все это, потому что модули являются PCHs в их perfect форме.PCH - это, по сути, гигантский хак, построенный поверх системы, которая не учитывает фактические модули.В конечном счете, целью модулей является получение файла, создание файла модуля для конкретного компилятора, который содержит символы, а затем некоторые другие файлы загружают этот модуль по мере необходимости.Символы предварительно скомпилированы, поэтому, опять же, нет необходимости #include кучу вещей, запустить компилятор и т. Д. Ваш код говорит, import thing.foo
, и он появляется.
Посмотрите на любой изполученные из STL заголовки стандартной библиотеки.Возьмите <map>
для примера.Хорошие шансы, что этот файл либо гигантский, либо содержит много # включений других файлов, которые делают результирующий файл гигантским.Это много синтаксического анализа C ++, который должен произойти.Это должно произойти для каждого .cpp файла, содержащего #include <map>
.Каждый раз, когда вы компилируете исходный файл, компилятор должен перекомпилировать одно и то же.Над.И более.И снова.
Меняется ли <map>
между компиляциями?Нет, но ваш компилятор не может этого знать.Так что он должен продолжать перекомпилировать его.Каждый раз, когда вы прикасаетесь к файлу .cpp, он должен компилировать каждый заголовок, который содержит этот файл .cpp.Даже если вы не касались тех заголовков или исходных файлов, которые влияют на эти заголовки.
PCH-файлы были способом обойти эту проблему.Но они ограничены, потому что они просто взломать.Вы можете включить только один файл .cpp, потому что он должен быть первым, включенным в файлы .cpp.И поскольку существует только один PCH, если вы делаете что-то, что изменяет PCH (например, добавляете к нему новый заголовок), вам нужно перекомпилировать все в этом PCH.
Модули по существуне имеет ничего общего с кросс-компилятором ABI (хотя было бы неплохо иметь один из них, а с модулями было бы немного легче его определить).Их основная цель - ускорить время компиляции.