Maison >développement back-end >C++ >Comment le « modèle externe » en C 11 peut-il éviter les instanciations de modèles redondantes ?

Comment le « modèle externe » en C 11 peut-il éviter les instanciations de modèles redondantes ?

DDD
DDDoriginal
2024-12-20 14:59:13327parcourir

How Can `extern template` in C  11 Avoid Redundant Template Instantiations?

Éviter l'instanciation de modèle avec un modèle externe (C 11)

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.

Utilisation pour les modèles de fonctions

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.

Utilisation pour les modèles de classe

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 dans source1.cpp, en veillant à ce qu'il ne soit instancié qu'une seule fois dans le projet.

Considérations importantes

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn