Создание шаблона дорого во время компиляции, но виртуально бесплатно во время выполнения. По сути, каждый раз, когда вы используете новый тип шаблона, компилятор должен генерировать код для этого нового типа, поэтому код находится в заголовке, чтобы у компилятора был доступ к коду позже.
Помещение всего вашего кода в .cpp позволяет компилятору компилировать этот код только один раз, что значительно ускоряет компиляцию. Теоретически вы можете написать весь свой код в заголовках, он будет работать нормально, но для компиляции очень больших проектов потребуется вечность. Кроме того, как только вы измените одну строку в любом месте, вам придется все перестраивать.
Теперь вы можете спросить, почему STL и BOOST не такие медленные? Вот где на помощь приходят предварительно скомпилированные заголовки. PCH позволяют компилятору выполнять самую дорогостоящую работу только один раз. Это хорошо работает с кодом, который не будет часто меняться, как библиотеки, но его эффект полностью аннулируется для кода, который сильно меняется, так как вам придется каждый раз перекомпилировать весь набор предварительно скомпилированных заголовков. Компилятор также использует несколько приемов, чтобы избежать перекомпиляции всего кода шаблона в каждом модуле компиляции.
Также обратите внимание, что C ++ 0x представит явные механизмы для лучшего управления созданием шаблона. Вы сможете явно создавать экземпляры шаблонов и, самое главное, предотвращать создание экземпляров в некоторых модулях компиляции. Однако большая часть этой работы уже выполняется большинством компиляторов без нашего ведома.
Итак, эмпирическое правило: поместите как можно больше кода (и включите директивы) в ваш .cpp. Если вы не можете, ну, вы не можете.
Мой совет: не создавайте шаблон просто из-за этого . Если вам нужен шаблон, будьте осторожны и помните, что вы на самом деле выбираете между скоростью компиляции и удобством использования шаблона.