Можно ли включить заголовок в проект только один раз? - PullRequest
0 голосов
/ 05 августа 2020

Помимо более простого синтаксиса, Go утверждает, что он в значительной степени обеспечивает быструю скорость компиляции, импортируя зависимости только один раз:

Go импортирует зависимости один раз для всех файлов, поэтому время импорта не увеличивается экспоненциально с размером проекта.

Возможно ли sh сделать то же самое с C ++, если вы будете осторожны с дизайном? один включаемый файл (который использует прагму один раз), который включен во все файлы? Или это сильно замедлит работу, так как любое изменение любого заголовка приведет к перекомпиляции всего, а не инкрементального?

Я использую LLVM. Все еще занимаюсь проектированием проекта.

Ответы [ 3 ]

2 голосов
/ 05 августа 2020

Да, можно значительно сократить время сборки в C ++, тщательно управляя структурой кода.

Один из способов добиться этого - широко использовать форвардные объявления. Существует инструмент, который помогает достичь этого: Включите то, что вы используете .

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

Другой способ ускорить время сборки - широко использовать инверсию зависимостей. Но это общее правило для любого языка.


К счастью, C ++ 20 поставляется с поддержкой модулей, что должно значительно упростить этот процесс (больше никаких файлов заголовков).
2 голосов
/ 05 августа 2020

Обычно проект состоит из множества файлов. cpp. Файл. cpp со всем, что он включает, является единицей перевода (TU). Они компилируются отдельно, а затем связываются с исполняемым файлом или dll.

Ваше решение заставит каждый отдельный TU, несмотря на то, насколько малы его зависимости, включать этот огромный файл заголовка. Он будет включен один раз, но один раз для каждого файла. cpp в вашем проекте.

Скорее всего, это замедлит компиляцию. Не говоря уже о всех проблемах такой архитектуры - поддержание работоспособности этой кодовой базы было бы болезненным.

В вашем вопросе есть понимание - возможно, вам нужны предварительно скомпилированные заголовки. При осторожном использовании в некоторых случаях они могут сократить время компиляции.

0 голосов
/ 05 августа 2020

Многие компиляторы поддерживают «Предварительно скомпилированные заголовки». Таким образом, даже если данный заголовок используется в нескольких единицах трансляции, компилятор скомпилирует его только в первый раз и кэширует результат для использования в последующих единицах. Проверьте документацию вашего компилятора, поддерживается ли эта функция и как ее использовать.

...