Некоторые компиляторы (на самом деле только MSV C) могут хорошо использовать предварительно скомпилированные заголовки. Фактически это означает, что если у вас есть один и тот же включаемый файл в начале каждой единицы компиляции, то вы можете указать компилятору обработать его только один раз, а для каждой другой единицы компиляции начать обработку только сразу после этого include.
Если вы видите проекты с заголовком stdafx.h
, который включает в себя множество других заголовков, обычно используемых в проекте, то это просто так.
Другие компиляторы, такие как g cc или clang, намного быстрее обработка исходного кода, поэтому от кэширования такого неполного представления пока нет никакой выгоды.
Помимо предварительно скомпилированных заголовков, они также служат в качестве общего интерфейса между модулями компиляции. Когда мы говорим о C ++ с шаблонами или C с чрезмерным генерированием кода шаблонами, то иногда важно ограничить видимость результирующих символов только этой конкретной единицей компиляции c на этапе компиляции. Для ограничения видимости во время следующей фазы связывания следует использовать ключевое слово static
.
На самом деле это не влияет на большинство проектов. Фактически, для небольших проектов общий метод фактически состоит в объединении всех единиц компиляции непосредственно перед компиляцией, так что разделение устраняется во время компиляции без специального шага связывания. При отсутствии конфликтов в символах stati c из объединенных единиц компиляции, это на самом деле имеет тенденцию экономить намного больше времени компиляции, чем строгое использование минимальных интерфейсов в заголовке. чтобы уменьшить видимость из соображений производительности компилятора, как только вы получите более 50-100 тыс. символов, видимых в одной единице компиляции.