Модули 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 для публикации.)

Другие вопросы по тегам