Utilisation d'un modèle externe pour optimiser l'instanciation de modèle
En C 11, extern template est un mot-clé puissant qui peut être utilisé pour éviter l'instanciation redondante de modèles, en particulier lorsque plusieurs unités de traduction (par exemple, fichiers .cpp) peuvent inclure le même fichier d'en-tête contenant le modèle définitions.
Concept de modèle externe
Le modèle externe informe essentiellement le compilateur que l'unité de traduction actuelle ne doit pas instancier un modèle spécifique, même s'il est déclaré dans le fichier inclus. en-tête. Ceci est utile lorsque vous savez que le modèle sera instancié dans une unité de traduction différente du même projet.
Utilisation des modèles de fonctions
Pour les modèles de fonctions, un fichier externe La déclaration de modèle peut être utilisée comme suit :
#include "header.h" extern template void f<T>(); // Avoid instantiation in this translation unit
Cela indique que le modèle f sera défini ailleurs dans le projet et ne doit pas être instancié dans le projet actuel.
Utilisation pour les modèles de classe
De même, pour les modèles de classe, une déclaration de modèle externe prend la forme suivante :
#include "header.h" extern template class foo<int>; // Avoid instantiation in this translation unit
Cela garantit que la classe de modèle foo n'est pas instanciée dans cette unité de traduction particulière.
Optimisation Applications
Considérez le scénario suivant :
// header.h template<typename T> void f();
// source1.cpp #include "header.h" void f<int>();
// source2.cpp #include "header.h" void f<string>();
Sans modèle externe, source1.cpp et source2.cpp instancieront le modèle f, conduisant à plusieurs définitions et perte de temps de compilation. En utilisant un modèle externe dans l'un des fichiers, nous évitons cette redondance :
// source1.cpp #include "header.h" void f<int>();
// source2.cpp #include "header.h" extern template void f<int>(); void f<string>();
Points clés
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!