2014-10-08 10 views
9

Stava suggerendo di utilizzare l'istanziazione del template esplicita per ridurre i tempi di compilazione. Mi sto chiedendo come farlo. Per esempioCome utilizzare l'istanziazione esplicita del modello per ridurre i tempi di compilazione?

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

Ma in ogni unità di traduzione che a.h è incluso, a quanto pare verranno compilati A<int>. Il tempo di compilazione non è ridotto. Come utilizzare l'istanziazione esplicita del template per ridurre i tempi di compilazione?

risposta

9

Se si sa che il modello verrà utilizzato solo per determinati tipi, consente di chiamarli T1, T2, è possibile spostare l'implementazione nel file di origine, come classi normali.

//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

L'implementazione non dovrebbe essere sotto forma di 'modello void Foo :: f() {}'? Nota 'Foo ::' invece di 'Foo ::' – Xupicor

+1

Hai ragione su questo. – fghj

15

Dichiarare l'istanza nell'intestazione:

extern template class A<int>; 

e definirlo in un file sorgente:

template class A<int>; 

Ora sarà istanziato solo una volta, non in ogni unità di traduzione, che potrebbe accelerare cose sopra.

+0

fredda non lo sapeva –

+0

Sarà un'istanza in tutti i file sorgente con esplicito modello di direttiva definizione di istanza ('modello di classe A ;'). – Constructor

+1

@Constructor: Infatti. Se fai ciò che la risposta dice, succederà solo una volta. –

Problemi correlati