instancji szablonu jest kosztowne w czasie kompilacji, ale virtualy darmo przy starcie . Zasadniczo za każdym razem, gdy używasz nowego typu szablonu, kompilator musi wygenerować kod dla tego nowego typu, dlatego kod znajduje się w nagłówku, aby kompilator miał później dostęp do kodu.
Umieszczenie całego kodu w pliku .cpp pozwala kompilatorowi skompilować ten kod tylko raz, co znacznie przyspiesza kompilację. Można teoretycznie napisać cały kod w nagłówkach, będzie działał dobrze, ale będzie to trwało wiecznie, aby skompilować bardzo duże projekty. Ponadto, gdy tylko zmienisz jedną linię w dowolnym miejscu, będziesz musiał odbudować wszystko.
Teraz możesz zapytać, dlaczego STL i BOOST nie są takie powolne? Właśnie tam przychodzą na ratunek skompilowane nagłówki. PCH pozwolił kompilatorowi wykonać najbardziej kosztowną pracę tylko raz. Działa to dobrze z kodem, który nie zmieni się często jak biblioteki, ale jego efekt jest całkowicie unieważniony dla kodu, który bardzo się zmienia, ponieważ będziesz musiał przekompilować cały zestaw prekompilowanych nagłówków za każdym razem. Kompilator używa również kilku sztuczek, aby uniknąć rekompilacji całego kodu szablonu w każdej jednostce kompilacji.
Należy również zauważyć, że C++ 0x wprowadzi jawne mechanizmy, które lepiej kontrolują tworzenie szablonu. Będziesz mógł jawnie tworzyć instancje szablonów i, co najważniejsze, zapobiegać instancji w niektórych jednostkach kompilacji. Jednak większość tej pracy jest już wykonywana przez większość kompilatorów bez naszej wiedzy.
Zasada jest więc taka, że w swoim pliku .cpp umieść jak najwięcej kodu (i dołącz do niego dyrektywy). Jeśli nie możesz, cóż, nie możesz.
Moja rada byłaby: nie szablon tylko do cholery. Jeśli musisz szablonować, zachowaj ostrożność i pamiętaj, że wybierasz szybkość kompilacji i użyteczność szablonu.
To niedorzeczne, że to pytanie zostało zamknięte. Dla mnie jest jasne i oczywiste, o co mnie proszono. I myślę, że odpowiedź na to pytanie byłaby bardzo przydatna na tej stronie. – Omnifarious
@Omni: Głosowałem, aby zamknąć to pytanie, ponieważ (IMHO) jest to kombinacja wojny płomieniowej, która czeka, aby się wydarzyć, i otwartych nieusankcjonowanych ("czy nie powinienem polegać głównie na szablonach?"). –
@Ol Charlseworth - Ahh, tak, widzę, że używany język byłby trochę zapalny. Zamienię to na bardziej neutralne pytanie. – Omnifarious