Maison >développement back-end >C++ >Comment le « modèle externe » évite-t-il l'instanciation de modèles redondants en C ?

Comment le « modèle externe » évite-t-il l'instanciation de modèles redondants en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-14 12:50:12682parcourir

How Does `extern template` Avoid Redundant Template Instantiation in C  ?

Utilisation d'un modèle externe pour éviter l'instanciation de modèle (C 11)

Dans la programmation orientée objet, les modèles jouent un rôle crucial dans la fourniture de solutions génériques qui fonctionnent avec différents types de données. Cependant, lorsque plusieurs fichiers sources instancient des modèles avec les mêmes paramètres, cela peut conduire à plusieurs définitions et à une augmentation du temps de compilation.

Le mot-clé extern template peut être utilisé pour résoudre ce problème et éviter une instanciation de modèle inutile. Il demande au compilateur de ne pas instancier une spécialisation de modèle particulière dans l'unité de traduction actuelle. Au lieu de cela, le compilateur s'appuie sur l'instanciation du modèle dans un autre fichier source ou une bibliothèque liée.

Modèles de fonction

Lorsqu'il s'agit de modèles de fonction, un modèle externe peut être utilisé pour forcer l’exclusion de l’instanciation explicite du modèle. Par exemple, considérons l'extrait de code suivant :

// header.h
template<typename T>
void f();

// source1.cpp
#include "header.h"
void f<int>(); // Explicit instantiation

// source2.cpp
#include "header.h"
extern template void f<int>(); // Prevents explicit instantiation
void g() {
    f<int>();
}

Dans ce scénario, source1.cpp instancie explicitement f tandis que source2.cpp utilise un modèle externe pour éviter toute instanciation inutile. Le compilateur utilisera l'instanciation de source1.cpp lorsque f est appelé dans source2.cpp.

Modèles de classe

Le même principe s'applique aux modèles de classe. extern template peut être utilisé pour éviter plusieurs instanciations de la même classe de modèle avec les mêmes paramètres. Prenons l'exemple suivant :

// header.h
template<typename T>
class foo {
public:
    void f();
};

// source1.cpp
#include "header.h"
template class foo<int>; // Explicit instantiation

// source2.cpp
#include "header.h"
extern template class foo<int>; // Prevents explicit instantiation
void h() {
    foo<int> obj;
}

Ici, le modèle extern dans source2.cpp empêche l'instanciation explicite de foo, garantissant que l'instanciation de source1.cpp est utilisée à la place.

Avantages de l'utilisation d'un modèle externe

L'utilisation d'un modèle externe offre plusieurs avantages :

  • Temps de compilation réduit : En évitant les instanciations de modèles inutiles, le temps de compilation peut être considérablement réduit.
  • Fichiers objets plus petits : Plusieurs instanciations du même modèle entraînent des fichiers objets plus volumineux. Le modèle externe permet d'éliminer ce problème.
  • Code cohérent : En garantissant que les modèles ne sont instanciés qu'une seule fois, cela favorise la cohérence et réduit le risque d'erreurs.

Conclusion

extern template est un mot-clé puissant qui permet aux développeurs de contrôler l'instanciation du modèle et d'optimiser la compilation temps. En l'utilisant judicieusement, les développeurs peuvent garantir que les modèles sont utilisés efficacement et éviter les pièges des instanciations multiples, ce qui se traduit par une compilation plus rapide et des exécutables plus petits.

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