Согласно модулям предложений, с самой бумаги цитируемой, это первое из трех основных задач для добавления модулей:
1 Введение
модули представляют собой механизм для упаковки библиотек и инкапсулировать их реализации. Они отличаются от традиционного подхода единиц перевода и заголовков в основном в тем, что все сущности определены только в одном месте (даже классы, шаблоны и т. Д.). Эта статья предлагает механизм модуля (нечто подобное тому, что в Модуле-2) с тремя основными задачами:
- значимо улучшить время сборки крупных проектов
- Включить лучшее разделение между интерфейсом и реализацией
- Обеспечить жизнеспособный путь перехода для существующих библиотек. Хотя эти цели являются движущими, предложение также разрешает ряд других давних практических проблем на C++ (порядок инициализации, производительность во время выполнения и т. Д.).
Итак, как они могут достичь этих целей? Ну, из раздела 4.1:
Поскольку заголовок фи ле, как правило, включены во многих других фи ле, то росте циклов сборки, как правило, длинномолекулярный относительно общего количества исходного кода. Если проблема не будет устранена, она, вероятно, ухудшится, так как использование шаблонов увеличивается, и к языку добавляются более мощные декларативные средства (такие как концепции, программирование контрактов, и т. Д.).
модулей решить эту проблему путем замены механизма текстуальной включении (чей время обработки примерно пропорционально количество кода, включенным) с помощью скомпилированного механизма крепления модуля (чьи обработок времени при правильном implemented- примерно пропорционально количество импортированных деклараций). Свойство, которое клиентские модули не нужно перекомпилировать при изменении личных ограничений модуля, может быть сохранено.
Другими словами, время, затрачиваемое на анализ этих шаблонов, выполняется только один раз вместо N раз, что уже является большим улучшением.
В последующих разделах описываются улучшения для таких вещей, как явное создание экземпляров. Единственное, что прямо не улучшается, это автоматическое создание шаблона, как признается в разделе 5.8. Здесь все, что может быть гарантировано, - это та же самая выгода, которую вы уже получили от предварительно скомпилированных заголовков: «Оба модуля Set и Reset должны создавать экземпляр Lib :: S и на самом деле оба раскрывают этот экземпляр в своем файле интерфейса.«Но предложение затем дает некоторые возможные технические решения для проблем ODR, по крайней мере некоторые из них также решают проблему множественного экземпляра и могут быть недоступны в сегодняшнем мире. Например, предлагаемый тип запросов, предложенный для запросов, неоднократно повторялся и это обычно считается слишком сложным для правильной работы с сегодняшней моделью, но модули могут сделать это возможным. Нет никаких доказательств того, что сегодня невозможно добиться успеха, просто испытывайте, что это сложно, и нет никаких доказательств того, что с модулями будет проще, просто Вероятно, возможно, что это возможно.
И это соответствует общему утверждению, которое никогда не было заявлено в предложении, но есть в фоновом режиме: упрощение компиляции означает, что мы можем получить новые оптимизации в процессе (напрямую, поскольку это легче рассуждать о том, что происходит, или косвенно, потому что больше людей работа над проблемой, когда это не такая огромная боль).
Таким образом, модули могут и, безусловно, сделать сборку шаблонов быстрее, если только по той причине, что сами определения шаблонов должны быть проанализированы только один раз. Они могут допускать другие преимущества, которые невозможны или труднее сделать без модулей, но это может быть небезопасно.
Что такое модуль, на языках C++? –
http://www.open-std.org/JTC1/SC22/wg21/docs/papers/2012/n3347.pdf – David