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