2010-09-03 2 views
6

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

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

ответ

4

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

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

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

1

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

12

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

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

+5

Когда вы проголосуете за ответы в течение первых нескольких раз, появляется окно с просьбой объяснить, почему вы это сделали. Через некоторое время этого больше не происходит. Однако это не потому, что вы больше не должны объяснять нисходящие голоса, а потому, что вам нужно знать это к тому времени. Сказать смело: __Вы все еще должны объяснять, почему вы проголосовали .__ – sbi

+0

Не уверен, но, возможно, фанат C пришел и подумал: «Механизм древних включений в порядке, C быстро компилируется с ним» – jalf

+0

Предварительно скомпилированные заголовки помогают решить эту проблему проблема - вы можете предварительно скомпилировать весь STL, чтобы он разбирался только один раз при компиляции проекта. – AshleysBrain

1

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

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

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

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