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
Libérer: 2024-12-20 14:59:13
original
326 Les gens l'ont consulté

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>();
}
Copier après la connexion

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();
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal