extern template est un puissant mot-clé C 11 qui permet aux développeurs d'empêcher l'instanciation d'un modèle dans une unité de compilation spécifique . Cela peut être particulièrement utile lorsque vous travaillez avec des bases de code volumineuses où plusieurs fichiers sources peuvent instancier le même modèle avec des paramètres différents, entraînant une duplication de code et une augmentation du temps de compilation.
Dans le cas de modèles de fonction, le modèle externe peut être utilisé pour forcer le compilateur à ne pas instancier un modèle particulier lorsqu'il sait que la fonction sera instanciée ailleurs. Prenons l'exemple suivant :
// header.h template<typename T> void ReallyBigFunction() { // Body }
// source1.cpp #include "header.h" void something1() { ReallyBigFunction<int>(); }
// source2.cpp #include "header.h" extern template void ReallyBigFunction<int>(); void something2() { ReallyBigFunction<int>(); }
Sans modèle externe, le compilateur compilerait ReallyBigFunction
source1.o void something1() void ReallyBigFunction<int>() // Compiled first time source2.o void something2() void ReallyBigFunction<int>() // Compiled second time
La liaison de ces fichiers ensemble entraînerait une copie de ReallyBigFunction
Pour éviter ce problème, nous pouvons utiliser un modèle externe dans source2.cpp :
// source2.cpp #include "header.h" extern template void ReallyBigFunction<int>(); void something2() { ReallyBigFunction<int>(); }
Cela entraînera les fichiers objets suivants :
source1.o void something1() void ReallyBigFunction<int>() // Compiled just one time source2.o void something2() // No ReallyBigFunction<int> here because of the extern
Lorsque ces fichiers objets sont liés, le deuxième fichier objet utilisera le symbole du premier fichier objet, évitant ainsi la duplication de code et réduisant la compilation time.
Le modèle externe peut également être utilisé avec des modèles de classe pour empêcher l'instanciation de membres de classe spécifiques. Par exemple :
// header.h template<typename T> class Foo { public: T f(); };
// source1.cpp #include "header.h" Foo<int> foo1;
// source2.cpp #include "header.h" extern template class Foo<int>; Foo<int> foo2;
Sans modèle externe, le compilateur compilerait la fonction membre f pour Foo
le modèle extern est un outil précieux pour éviter la duplication de code et réduire le temps de compilation dans les projets C 11. En utilisant de manière sélective un modèle externe pour éviter les instanciations inutiles de modèles, les développeurs peuvent optimiser les performances de leur code.
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!