Каковы профессионалы и недостатки предварительно скомпилированных заголовков конкретно в среде/наборе инструментальных средств GNU/Linux?

Нет, они не существуют.

я знаю, что команда C# рассматривала их однажды (или по крайней мере Eric Lippert был) - вместе с дополнительными конструкторами и операторами (они могут требовать времени для получения головы вокруг, но спокойны...), Однако, я не видел доказательства, что они будут частью C# 4.

РЕДАКТИРОВАНИЕ: Они не появились в C# 5, и по состоянию на июль 2014 не похоже, что это будет в C# 6 также.

Eric Lippert , Основной Разработчик в команде компилятора C# в Microsoft в течение ноября 2012, занесенного в блог об этом в октябре 2009:

24
задан Martin v. Löwis 27 August 2009 в 20:55
поделиться

6 ответов

Единственное потенциальное преимущество предварительно скомпилированных заголовков состоит в том, что если ваши сборки слишком медленные, предварительно скомпилированные заголовки могут их ускорить. Возможные минусы:

  • Больше зависимостей Makefile для исправления; если они ошибаются, вы быстро создаете не то. Плохо.

  • В принципе, не каждый заголовок можно предварительно скомпилировать. (Подумайте о том, чтобы поставить некоторые #define перед #include.) Итак, в каких случаях gcc действительно работает правильно? Насколько вы хотите доверять этой новейшей функции.

Если ваши сборки достаточно быстрые, нет причин использовать предварительно скомпилированные заголовки . Если ваши сборки слишком медленные, я бы рассмотрел

  • Покупку более быстрого оборудования, которое дешево по сравнению с зарплатой

  • Использование такого инструмента, как AT&T nmake или подобного ccache (Dirk правильно), оба из них используют надежные методы, позволяющие избежать повторной компиляции.

10
ответ дан 29 November 2019 в 00:01
поделиться

Я не могу разговаривать с GNU / gcc / linux, но я имел дело с предварительно скомпилированными заголовками в vs2005:

Плюсы:

  • Экономит время компиляции, когда у вас большие заголовки, в которых много модулей включают.
  • Хорошо работает с заголовками (например, сторонними), которые очень сильно меняются нечасто.

Минусы:

  • Если вы используете их для заголовков, которые сильно меняются, это может увеличить время компиляции.
  • Может быть неудобно настраивать и поддерживать.
  • Есть случаи, когда изменения в заголовках явно игнорируются если вы не принудительно компилируете предварительно скомпилированный заголовок.
8
ответ дан 29 November 2019 в 00:01
поделиться

Интерфейс кэширования ccache для gcc, g ++, gfortran, ... у меня отлично работает. Как говорится на его веб-сайте

ccache - это кеш компилятора. Он действует как кэширующий препроцессор для C / C ++ компиляторы, используя компилятор -E переключатель и хеш, чтобы определить, когда компиляция может быть удовлетворена из кеш. Это часто дает от 5 до 10 ускорение в раз при обычных компиляциях.

В Debian / Ubuntu просто выполните ' apt-get install ccache ' и создайте программные ссылки, скажем, в / usr / local / bin с именами gcc , g ++ , gfortran , c ++ , ... которые указывают на / usr / bin / ccache .

[ РЕДАКТИРОВАТЬ ] Чтобы сделать это более явным в ответ на некоторые ранние комментарии: Это обеспечивает по существу предварительно скомпилированные заголовки и исходные коды путем кэширования большей части этапа компиляции. Таким образом, он использует идею, аналогичную предварительно скомпилированным заголовкам, и развивает ее. Ускорение может быть значительным - от 5 до 10, как указано на сайте.

5
ответ дан 29 November 2019 в 00:01
поделиться

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

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

4
ответ дан 29 November 2019 в 00:01
поделиться

В документации GNU gcc обсуждаются возможные подводные камни с предварительно скомпилированными заголовками.

4
ответ дан 29 November 2019 в 00:01
поделиться

Я использую PCH в проекте Qt, который использует cmake в качестве системы сборки, и это экономит много времени. Я взял несколько скриптов cmake для PCH, которые требовали некоторой настройки, так как они были довольно старыми, но в целом их было проще настроить, чем я ожидал. Я должен добавить, я не особо разбираюсь в cmake.

Сейчас я включаю большую часть Qt (QtCore, QtGui, QtOpenGL) и сразу несколько стабильных заголовков.

Плюсы:

  • Для Классы Qt, предварительные объявления не требуются и, конечно же, не включаются.
  • Быстро.
  • Простота настройки.

Минусы:

  • Вы не можете включать PCH в заголовки. Это не большая проблема, за исключением того, что вы используете Qt и позволяете системе сборки переводить файлы moc отдельно, что, как оказалось, является именно моей конфигурацией. В этом случае, вам нужно # включить заголовки qt в ваши заголовки, потому что mocs создаются из заголовков. Решение заключалось в том, чтобы добавить дополнительную защиту включения вокруг #include в заголовке.
0
ответ дан 29 November 2019 в 00:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: