Эффективный С++ "35. Минимизация зависимостей компиляции между файлами". Это все еще действует сегодня?

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

Мои вопросы:

  • В моих прошлых проектах я никогда не обращал внимания на это правило. Время компиляции не является коротким, но это не невыносимо. Это могло бы иметь больше общего с масштабом (или отсутствием) моих проектов. Насколько практичен этот совет сегодня, учитывая прогресс в технологии компилятора (например, clang)?

  • Где я могу найти больше примеров использования этих методов? (например, Gnome или другие проекты OSS)

P.S. Я использую второе издание.

Ответы

Ответ 1

Я не думаю, что технология компилятора особенно продвинулась вперед. clang - это не какая-то магия - если у вас есть зависимости, тогда вы вносите изменения, тогда зависимый код придется перекомпилировать. Это может занять очень много времени - читать часы или даже дни для большого проекта, поэтому люди стараются минимизировать такие зависимости, когда это возможно.

Сказав это, можно переусердствовать - превратить все классы в PIMPL, переслать декларирование всего и т.д. Выполнение этого просто приводит к запутанному коду, и его следует избегать, когда это возможно.

Ответ 2

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

Что касается Gnome, Gnome имеет "частный указатель" в каждом GObject. Это реализует идиому pimpl. Это уменьшает зависимости между исходными файлами и позволяет использовать некоторую форму инкапсуляции. Есть меньше проблем времени компиляции для проектов C.

Современные разработки на С++ сильно используют шаблоны, которые неизбежно заставляют время компиляции стремительно расти. Использование классов именования pimpl и forward (вместо включения заголовка, где это возможно) уменьшает логические зависимости между единицами перевода (это хорошо), но во многих ситуациях не очень помогает время компиляции.

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

Следует также упомянуть, что тонкая идиома шаблона часто используется для уменьшения раздувания кода с помощью шаблонов.