Почему шаблоны так медленно компилируются? - PullRequest
6 голосов
/ 03 сентября 2010

Крупные шаблонные проекты медленно компилируются, и STL является основным виновником этого, как видно из эмпирических данных. Но почему это медленно компилируется?

Ранее я оптимизировал сборки, наблюдая за включениями заголовков и комбинируя модули компиляции, но я не понимаю, почему библиотеки шаблонов так медленно компилируются.

Ответы [ 4 ]

16 голосов
/ 03 сентября 2010

C ++ в целом медленно компилируется из-за древнего механизма включения, который заставляет компилятор рекурсивно пересматривать каждый заголовок со всеми его объявлениями и определениями и всем, что включено для каждой единицы перевода .

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

4 голосов
/ 03 сентября 2010

Шаблонный код должен восприниматься как другой язык для генерации кода C ++.

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

Я слышал, что не все компиляторы делают это точно, но это основная идея, и это предполагает, что раньше было намного большедействительно скомпилировать код, так как часть кода должна быть сгенерирована первой.

1 голос
/ 03 сентября 2010

Подумайте, что такое шаблон реального мира - это не фактическая вещь, а указания о том, как создавать реальные вещи.

В случае шаблонов C ++ заголовочный файл не содержитфактический, например, «вектор», но инструкции о том, как построить vector.Каждый раз, когда мы создаем исходный файл #include s <vector>, компилятор должен создавать новый код vector, возможно, несколько раз, если мы создаем vector s с различными параметрами шаблона.

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

1 голос
/ 03 сентября 2010

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

...