компиляция — модули C ++: модули реализации модулей для ненужной перекомпиляции?

Недавно просмотренное видео с CppCon 2017: Борис Колпаков «Сборка модулей C ++»
https://www.youtube.com/watch?v=E8EbDcLQAoc

Примерно в 31:35 он начинает объяснять, что мы все еще должны использовать разбиение заголовка / источника и показывает 3 причины. Первая причина:

Если у вас есть оба объявления / определения в одном месте, когда вы касаетесь этого модуля, все остальные модули, которые зависят от интерфейс модуля (ИМТ) будет перекомпилирован.

И это мне совсем не понравилось. Похоже, что мы все еще в 90-х, и компиляторы не могут быть достаточно умными, чтобы увидеть разницу в изменениях, связанных с ИМТ, и изменениях, связанных с реализацией. На мой взгляд, компиляторы могут быстро сканировать каждый модуль и генерировать из него только BMI. И если BMI не изменяется — не перекомпилируйте другие модули, которые зависят от него.

Или я что-то упустил?

2

Решение

Автор этого доклада позже сказал, что проблема перекомпиляции является вопросом реализации. Цитирую статью Распространенные ошибочные представления о модулях C ++ TS Борис Колпаков:

Оказывается, многие люди хотели бы избавиться от разделения заголовка / исходного кода (или, в терминах модулей, разделения интерфейса / реализации) и сохранить все в одном файле. Вы Можно сделать это в модулях TS: с модулями (в отличие от заголовков) вы Можно определить не встроенные функции и переменные в модулях интерфейса модуля. Так что если вы хотите сохранить все в одном файле, вы Можно.

а также

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

квотирование Гор Нишанов (редактор проекта Coroutines TS) из связанной ветки:

Это зависит от вас, как структурировать ваш код. Модуль TS не навязывает вам, как вы разбиваете свой модуль на отдельные файлы. Если вы хотите, вы можете реализовать весь модуль в файле интерфейса (таким образом, у вас будет опыт работы на C #), или вы можете разбить ваш модуль на интерфейс и один или несколько файлов реализации.

Редактор проекта Модули TS, Габриэль Дос Рейс, прокомментировал реализацию MSVC:

В идеале только изменения, имеющие отношение к семантике, должны инициировать перекомпиляцию, основанную на IFC.

(Как примечание, Модули TS сейчас утвержден и отправлено в ISO для публикации.)

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector