Время компиляции C ++ - это битва за каждый проект выше определенного размера.К счастью, с таким количеством людей, которые пишут большие проекты на C ++, существует множество решений:
Классическим дешевым решением является "Unity build".Это просто означает использование #include
, чтобы собрать все ваши файлы .cpp в один файл для компиляции.«Unity build» возникла здесь во многих вопросах о stackoverflow, здесь - самый выдающийся из известных мне.Эта screencast демонстрирует, как настроить такую сборку в Visual Studio.
Насколько я понимаю, сборки Unity намного быстрее, чем классические сборки, поскольку они эффективно кэшируют работу, выполняемую препроцессором и компоновщиком.Недостатком сборки Unity является то, что если вы коснетесь одного файла cpp, вам придется перекомпилировать свой «большой» файл cpp.Вы можете обойти это, сломав файл cpp, который вы перебираете, из сборки Unity и скомпилировав его самостоятельно.
Помимо сборок Unity, вот список моих лучших практик:
- Используйте
#include
только в случае необходимости, предпочитайте предварительные объявления - Используйте идиому pimpl, чтобы не допустить реализации класса из обычно включаемых заголовочных файлов.Это позволяет добавлять элементы в реализацию без длительной перекомпиляции
- Использовать предварительно скомпилированные заголовки (pch) для часто включаемых заголовочных файлов, которые редко меняются
- Убедитесь, что ваша система сборки работает.используя все ядра, доступные на локальном оборудовании
- Сохраняйте список каталогов, который препроцессор должен искать минимально, используйте точные пути в
#include
инструкциях - Используйте
#pragma once
в верхней частизаголовочные файлы вместо #ifndef __FOO_H #define __FOO_H ... #endif
, если вы используете трюк #ifndef
, компилятору придется открывать заголовочный файл каждый раз, когда он включается, #pragma once
позволяет компилятору быть более эффективным
Если вы делаете все это (сборка Unity будет иметь наибольшее значение, по моему опыту), последний вариант - распределенное построение. distcc - лучшее бесплатное решение, которое я знаю, incredibuild - это проприетарный отраслевой стандарт.Я придерживаюсь мнения, что распределенные вычисления будут единственным способом получить отличное время итерации от грязного процесса компиляции C ++.Если у вас есть доступ к достаточно большому количеству машин (скажем, 10-20), это абсолютно стоит изучить.Я должен отметить, что сборки Unity и распределенные сборки не являются полностью симбиотическими, потому что традиционная компиляция может быть разбита на меньшие части работы, чем сборка Unity.Если вы хотите распространяться, то, вероятно, не стоит настраивать сборку Unity.