2012-08-03 2 views
9

Могут ли модули сделать компиляцию шаблонов быстрее? Шаблоны (обычно) должны быть только заголовками и в конечном итоге находиться в блоке перевода #includer.Могут ли модули сделать сборку шаблонов быстрее?

Родственные: Укомплектовывают ли предварительно скомпилированные заголовки сборку шаблонов быстрее?

+1

Что такое модуль, на языках C++? –

+3

http://www.open-std.org/JTC1/SC22/wg21/docs/papers/2012/n3347.pdf – David

ответ

10

Согласно модулям предложений, с самой бумаги цитируемой, это первое из трех основных задач для добавления модулей:

1 Введение

модули представляют собой механизм для упаковки библиотек и инкапсулировать их реализации. Они отличаются от традиционного подхода единиц перевода и заголовков в основном в тем, что все сущности определены только в одном месте (даже классы, шаблоны и т. Д.). Эта статья предлагает механизм модуля (нечто подобное тому, что в Модуле-2) с тремя основными задачами:

  • значимо улучшить время сборки крупных проектов
  • Включить лучшее разделение между интерфейсом и реализацией
  • Обеспечить жизнеспособный путь перехода для существующих библиотек. Хотя эти цели являются движущими, предложение также разрешает ряд других давних практических проблем на C++ (порядок инициализации, производительность во время выполнения и т. Д.).

Итак, как они могут достичь этих целей? Ну, из раздела 4.1:

Поскольку заголовок фи ле, как правило, включены во многих других фи ле, то росте циклов сборки, как правило, длинномолекулярный относительно общего количества исходного кода. Если проблема не будет устранена, она, вероятно, ухудшится, так как использование шаблонов увеличивается, и к языку добавляются более мощные декларативные средства (такие как концепции, программирование контрактов, и т. Д.).

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

Другими словами, время, затрачиваемое на анализ этих шаблонов, выполняется только один раз вместо N раз, что уже является большим улучшением.

В последующих разделах описываются улучшения для таких вещей, как явное создание экземпляров. Единственное, что прямо не улучшается, это автоматическое создание шаблона, как признается в разделе 5.8. Здесь все, что может быть гарантировано, - это та же самая выгода, которую вы уже получили от предварительно скомпилированных заголовков: «Оба модуля Set и Reset должны создавать экземпляр Lib :: S и на самом деле оба раскрывают этот экземпляр в своем файле интерфейса.«Но предложение затем дает некоторые возможные технические решения для проблем ODR, по крайней мере некоторые из них также решают проблему множественного экземпляра и могут быть недоступны в сегодняшнем мире. Например, предлагаемый тип запросов, предложенный для запросов, неоднократно повторялся и это обычно считается слишком сложным для правильной работы с сегодняшней моделью, но модули могут сделать это возможным. Нет никаких доказательств того, что сегодня невозможно добиться успеха, просто испытывайте, что это сложно, и нет никаких доказательств того, что с модулями будет проще, просто Вероятно, возможно, что это возможно.

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

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

+0

Я не думаю, что я единственный, кто думает, что это не означает * улучшит время сборки шаблонов. В нем говорится, что объекты (включая шаблоны) определены в 1 месте, а модули будут значительно улучшать время сборки. Я не предполагаю ничего другого, кроме этого. _How_ могут ли они улучшить время сборки шаблона - это то, что я должен был спросить. – David

+0

Ну, вы могли бы прочитать остальную часть документа. Я отредактирую свой ответ, чтобы добавить одну примерную цитату. – abarnert

+0

Я не уверен, что буду следовать, но можно экспортировать класс шаблона из модулей без указания экспортированных типов. I. вектор, алгоритмы и все в SDL могут быть экспортированы в виде модулей? –

-1

Я не знаю о модулях, но я знаю, что gcc даже теперь предоставляет предварительно скомпилированные заголовки, как и многие другие компиляторы. Предварительно скомпилированный заголовок может содержать очень эффективную машиносчитываемую версию описания шаблона, поэтому, когда это доступно после включения заголовка, многие шаги компиляции могут быть пропущены, что обычно требуется для несжатого заголовка исходного текста.

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

0

Скомпилировать ли предварительно скомпилированные заголовки быстрее?

Нет; он делает шаблоны не компилируется. Которая является целым как для PCH, так и для модулей: прекратить компиляцию всего.

Идея состоит в том, чтобы превратить «загрузить текст на C++ и скомпилировать» в «загрузить символы C++». Модули представляют собой обобщенную форму PCH.

Теперь у вас все еще есть стоимость экземпляров шаблонов (если только они не были созданы в PCH/модуле). Но стоимость компиляции кода шаблона C++ удаляется.

+3

Я, хотя «компиляция», включал в себя создание экземпляра. Я ... это точно. –

+0

@MooingDuck: Компиляция и создание экземпляров - это не одно и то же. Компиляция идет из текста C++ во внутреннее представление памяти. Мгновение происходит от представления внутренней памяти до фактических символов C++ (функций и объектов с именами) и реализаций. –

+1

В соответствии с спецификацией C++ компиляция начинается с сопоставления физических символов исходного файла с базовым набором символов и заканчивается ссылкой на внешние ссылки. Так что да, создание шаблона - это полностью часть компиляции. –

Смежные вопросы