2014-10-08 9 views
9

Sugerowano użycie instancji jawnego szablonu w celu skrócenia czasu kompilacji. Zastanawiam się, jak to zrobić. Na przykładJak używać instancji jawnego szablonu do skrócenia czasu kompilacji?

// a.h 
template<typename T> class A {...}; 
template class A<int>; // explicit template instantiation to reduce compilation time 

ale w każdej jednostce tłumaczeniowej A.H wliczono wydaje A<int> zostanie skompilowany. Czas kompilacji nie jest zmniejszony. Jak wykorzystać instancję jawnego szablonu do skrócenia czasu kompilacji?

Odpowiedz

9

Jeśli wiesz, że twój szablon będzie używany tylko dla niektórych typów, pozwala na wywoływanie ich T1, T2, możesz przenieść implementację do pliku źródłowego, jak zwykłe klasy.

//foo.hpp 
template<typename T> 
struct Foo { 
    void f(); 
}; 

//foo.cpp 
template<typename T> 
void Foo<T>::f() {} 

template class Foo<T1>; 
template class Foo<T2>; 
+0

Czy implementacja nie powinna mieć postaci 'template void Foo :: f() {}'? Uwaga 'Foo ::' zamiast 'Foo ::' – Xupicor

+1

Masz rację w tej sprawie. – fghj

15

stwierdzenie konkretyzacji w nagłówku:

extern template class A<int>; 

i zdefiniować je w jednym pliku źródłowym:

template class A<int>; 

Teraz będzie instancja tylko raz, nie w każdej jednostce translacji, co może przyspieszyć rzeczy w górę.

+0

Chłodny nie wiedział –

+0

Będzie instancji we wszystkich plikach źródłowych z dyrektywą definicja instancji jednoznacznie szablonu (klasy 'szablonowi ;'). – Constructor

+1

@ Konstruktor: Rzeczywiście. Jeśli zrobisz to, co mówi odpowiedź, stanie się to tylko raz. –

Powiązane problemy