2017-01-11 3 views
6

Ссылка на Wiki указывает, что некоторые заголовки могут иногда содержать большое количество исходного кода и, следовательно, иметь их в качестве предварительно скомпилированных заголовков, будут сохранять время компиляции. https://en.wikipedia.org/wiki/Precompiled_headerВ чем разница между предварительно скомпилированными заголовками и предварительно скомпилированными двоичными файлами

Если предварительно скомпилированный заголовок может содержать скомпилированный исходный код, то как он отличается от предварительно скомпилированных двоичных файлов.

+3

Нет такой вещи, как не прекомпилированный бинарный файл, поэтому концепция «предварительно скомпилированного двоичного кода» на самом деле не является чем-то, что можно сравнить с чем-либо еще. – EJP

+0

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

ответ

2

C++ определяет понятие «единицы перевода». Блок перевода является точкой привязки, где начинается перевод, а программа, как правило, включает в себя несколько таких единиц перевода. Какие единицы передаются компилятору, поскольку «единица перевода» на самом деле зависит от настроек в вашей среде IDE, от make-файлов и других конфигураций. Но неформально большинство конфигураций принимают ваши .cpp и .c - файлы как единицы перевода.

Чтобы сделать это проще, мы можем думать о модуле перевода, как о ком-то, из которого компилятор создает двоичный код, а компоновщик объединяет несколько двоичных файлов, а затем в программу.

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

Если такие файлы заголовков содержат много исходного кода, который будет включен в несколько единиц перевода, имеет смысл (предварительно) скомпилировать их один раз и сохранить как можно больше информации в промежуточном результате, например что компиляция фактической единицы перевода выполняется быстрее. Это экономит время, но «промежуточное двоичное» - это нечто внутреннее и не подвергаемое.

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

Надеюсь, что это поможет.

1

Главное отличие состоит в большей информации, хранящейся в предварительно скомпилированном заголовке, по сравнению с скомпилированным источником. Если вы скомпилируете источник в двоичную информацию об определениях и шаблонах, заблудитесь. Определяет равные нулю значения, а шаблоны получают только в инстанцированной форме в двоичный файл. Предварительно скомпилированный заголовок сохраняет информацию об общей форме шаблонов, а имя и значения определяет, насколько они необходимы, если предварительно скомпилированный заголовок включен где-то. Для предварительно скомпилированного заголовка с чистым источником идентичны скомпилированному источнику.

+0

«Для исходного исходного кода с чистым исходным кодом идентичны скомпилированному источнику». Могу ли я предположить, что часть исходного кода напрямую преобразуется в двоичную форму, когда создается файл .pch. – bharath

+1

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