Le mot-clé extern template en C 11 fournit un mécanisme pour empêcher les instanciations de modèles inutiles, réduisant ainsi le temps de compilation et le fichier objet taille. Dans certains scénarios, il est avantageux de savoir qu'un modèle sera instancié ailleurs et d'utiliser ce mot-clé pour demander au compilateur de ne pas effectuer l'instanciation.
Contrairement à l'exemple fourni dans la question, le mot-clé extern template peut également être utilisé pour les modèles de fonctions. Prenons l'exemple suivant :
// header.h template<typename T> void bigFunc(); // source1.cpp #include "header.h" void something1() { bigFunc<int>(); } // source2.cpp #include "header.h" extern template void bigFunc<int>(); // This prevents its compilation in source2.cpp void something2() { bigFunc<int>(); }
Sans l'instruction de modèle extern, bigFunc serait compilé à la fois dans source1.cpp et source2.cpp, ce qui entraînerait un code objet redondant. En utilisant un modèle externe, il est demandé au compilateur de ne pas instancier bigFunc dans source2.cpp, ce qui réduit le temps de compilation et la taille du fichier objet.
Comme l'illustre la figure 2 de la question, le modèle externe peut également être utilisé pour la classe. templates :
// header.h template<typename T> class myClass { T getValue(); }; // source1.cpp #include "header.h" extern template class myClass<int>; // Prevent instantiation here void something1() { myClass<int> obj; obj.getValue(); }
Dans ce scénario, il est demandé au compilateur de ne pas instancier myClass
L'utilisation d'un modèle externe doit être limitée aux situations où il est sachant que le modèle sera instancié ailleurs. S'il n'est pas instancié, le programme entraînera des références non résolues. À titre de bonne pratique, il est recommandé de déclarer toutes les instanciations de modèles dans un seul fichier d'en-tête, évitant ainsi les problèmes potentiels causés par plusieurs instanciations dans différents fichiers.
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!