Модули C++: модули реализации модулей для ненужной перекомпиляции?
Недавно просмотренное видео с CppCon 2017: Борис Колпаков "Сборка модулей C++" https://www.youtube.com/watch?v=E8EbDcLQAoc
Примерно в 31:35 он начинает объяснять, что мы все еще должны использовать разбиение заголовка / источника и показывает 3 причины. Первая причина:
Если у вас есть оба объявления / определения в одном месте, когда вы касаетесь этого модуля, все другие модули, которые зависят от интерфейса модуля (BMI), будут перекомпилированы.
И это мне совсем не понравилось. Похоже, что мы все еще в 90-х, и компиляторы не могут быть достаточно умными, чтобы увидеть разницу в изменениях, связанных с ИМТ, и изменениях, связанных с реализацией. На мой взгляд, компиляторы могут быстро сканировать каждый модуль и генерировать из него только BMI. И если BMI не изменяется - не перекомпилируйте другие модули, которые зависят от него.
Или я что-то упустил?
1 ответ
Автор этого доклада позже сказал, что проблема перекомпиляции является вопросом реализации. Цитирую статью Бориса Колпакова "Распространенные заблуждения С ++ о модулях TS ":
Оказывается, многие люди хотели бы избавиться от разделения заголовка / исходного кода (или, в терминах модулей, разделения интерфейса / реализации) и сохранить все в одном файле. Вы можете сделать это в модуле TS: с модулями (в отличие от заголовков) вы можете определять не встроенные функции и переменные в модулях интерфейса модуля. Так что если вы хотите сохранить все в одном файле, вы можете.
а также
Теперь хранение всего в одном файле может иметь негативные последствия для производительности сборки, но кажется, что достаточно умная система сборки в сотрудничестве с компилятором должна быть в состоянии преодолеть это. Смотрите это обсуждение для деталей.
Цитирую Гор Нишанова (редактор проекта Coroutines TS) из связанной ветки:
Это зависит от вас, как структурировать ваш код. Модуль TS не навязывает вам, как вы разбиваете свой модуль на отдельные файлы. Если вы хотите, вы можете внедрить весь ваш модуль в интерфейсный файл (таким образом, у вас будет опыт работы на C#), или вы можете разбить ваш модуль на интерфейс и один или несколько файлов реализации.
Редактор проекта TS модулей, Габриэль Дос Рейс, прокомментировал реализацию MSVC:
В идеале только изменения, имеющие отношение к семантике, должны инициировать перекомпиляцию, основанную на IFC.
(Как примечание, Модули TS теперь одобрены и отправлены в ISO для публикации.)