Заголовки компилируются быстрее? - PullRequest
0 голосов
/ 17 июня 2020

Я хотел go более подробно объяснить, почему используются заголовки, и после некоторых исследований я нашел убедительный ответ, но в большинстве ответов люди говорят, что это ускоряет компиляцию, но все эти ответы расплывчаты и не говорят как заголовки упрощают компиляцию. Может кто-нибудь, пожалуйста, go подробнее в теме? Спасибо.

Ответы [ 3 ]

0 голосов
/ 17 июня 2020

Разделение проекта на заголовки не увеличивает скорость компиляции, если вы компилируете с нуля.

Однако они делают модификацию кода намного быстрее. Компиляция проекта обычно проходит следующим образом. Сначала вы компилируете каждый файл в машинный код, который имеет относительные адреса (поэтому начальный адрес кода неизвестен). Они связывают все остальные файлы для создания вашего проекта.

Представьте, что у вас есть проект, в котором есть 10 000 файлов. Если вы измените только 1 файл, при сборке проекта будет скомпилирован только этот файл, тогда все остальные файлы будут связаны. Если вы не разделили проект на 10.000 файлов, при создании простого изменения вам придется скомпилировать все остальные 10.000 файлов. Так что, как только вы скомпилируете проект, отладка при таком подходе станет намного быстрее.

Кроме того, компиляция файла является однопоточной программой. Таким образом, вы можете парализовать скорость компиляции, скомпилировав несколько файлов вместе. Это делает флаг -j для команды make.

0 голосов
/ 17 июня 2020

Некоторые компиляторы (на самом деле только MSV C) могут хорошо использовать предварительно скомпилированные заголовки. Фактически это означает, что если у вас есть один и тот же включаемый файл в начале каждой единицы компиляции, то вы можете указать компилятору обработать его только один раз, а для каждой другой единицы компиляции начать обработку только сразу после этого include.

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

Другие компиляторы, такие как g cc или clang, намного быстрее обработка исходного кода, поэтому от кэширования такого неполного представления пока нет никакой выгоды.


Помимо предварительно скомпилированных заголовков, они также служат в качестве общего интерфейса между модулями компиляции. Когда мы говорим о C ++ с шаблонами или C с чрезмерным генерированием кода шаблонами, то иногда важно ограничить видимость результирующих символов только этой конкретной единицей компиляции c на этапе компиляции. Для ограничения видимости во время следующей фазы связывания следует использовать ключевое слово static.

На самом деле это не влияет на большинство проектов. Фактически, для небольших проектов общий метод фактически состоит в объединении всех единиц компиляции непосредственно перед компиляцией, так что разделение устраняется во время компиляции без специального шага связывания. При отсутствии конфликтов в символах stati c из объединенных единиц компиляции, это на самом деле имеет тенденцию экономить намного больше времени компиляции, чем строгое использование минимальных интерфейсов в заголовке. чтобы уменьшить видимость из соображений производительности компилятора, как только вы получите более 50-100 тыс. символов, видимых в одной единице компиляции.

0 голосов
/ 17 июня 2020

Забудьте о скорости компиляции. Проблема в ремонтопригодности программного обеспечения.

Заголовки предназначены для содержания материала, необходимого во время компиляции из разных источников, обычно #define констант и объявлений функций, составляющих API.

...