Maison > développement back-end > C++ > Comment un « modèle externe » peut-il empêcher l'instanciation de modèles redondants en C ?

Comment un « modèle externe » peut-il empêcher l'instanciation de modèles redondants en C ?

Barbara Streisand
Libérer: 2024-12-20 20:42:09
original
508 Les gens l'ont consulté

How Can `extern template` Prevent Redundant Template Instantiation in C  ?

Utiliser un modèle externe pour éviter l'instanciation de modèle

L'instanciation de modèle est une étape cruciale de la programmation C, où des instances de modèle spécifiques sont créées au moment de la compilation . Dans certains scénarios, il devient nécessaire de contrôler l'instanciation des modèles pour optimiser le temps de compilation et éviter les définitions redondantes. C'est là que le mot-clé extern template entre en jeu.

Modèles externes pour les modèles de fonctions

Lorsqu'il est utilisé avec des modèles de fonction, le modèle extern demande au compilateur de ne pas instancier le modèle spécifié. modèle au sein de l’unité de traduction actuelle. Cela signale qu'une instanciation de ce modèle sera trouvée ailleurs dans le programme. Ceci est particulièrement utile dans les scénarios où plusieurs fichiers sources instancient le même modèle avec des paramètres identiques, conduisant à plusieurs définitions que le compilateur doit supprimer.

Exemple :

Considérez le extrait de code suivant :

// header.h
template <typename T>
void f() { /* Body */}

// source1.cpp
#include "header.h"
void something1() { f<int>(); }

// source2.cpp
#include "header.h"
extern template void f<int>();
void something2() { f<int>(); }
Copier après la connexion

Dans ce cas, le modèle extern dans source2.cpp informe le compilateur que le f l'instanciation du modèle doit être prise ailleurs. Cela empêche le compilateur de générer une instanciation redondante et de la supprimer ultérieurement lors de la liaison.

Modèles externes pour les modèles de classe

Semblable aux modèles de fonction, le modèle externe peut également être utilisé avec des modèles de classe. Ceci est fait pour éviter plusieurs instanciations de classes de modèles avec les mêmes paramètres.

Exemple :

// header.h
template <typename T>
class MyClass { /* Body */}

// source1.cpp
#include "header.h"
MyClass<int> obj1;

// source2.cpp
#include "header.h"
extern template class MyClass<int>;
MyClass<int> obj2;
Copier après la connexion

Ici, le modèle extern dans source2.cpp garantit que le MaClasse La classe de modèle n'est instanciée qu'une seule fois, évitant ainsi les définitions redondantes.

Directives d'utilisation du modèle externe

  • Utilisez le modèle extern uniquement lorsque vous êtes certain qu'une instanciation de la classe de modèle Le modèle existe ailleurs dans le programme.
  • Cette technique peut être appliquée aux modèles de fonction, aux modèles de classe et même aux membres du modèle. fonctions.
  • Il est généralement conseillé de conserver toutes les définitions et instanciations de modèles dans un seul fichier d'en-tête pour éviter les conflits potentiels.
  • S'il n'est pas possible de centraliser les définitions de modèles, utilisez un modèle externe dans toutes mais un fichier source où le modèle est utilisé.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal