Maison > développement back-end > C++ > Comment le « modèle externe » en C 11 peut-il empêcher les instanciations de modèles en double et réduire le temps de compilation ?

Comment le « modèle externe » en C 11 peut-il empêcher les instanciations de modèles en double et réduire le temps de compilation ?

Patricia Arquette
Libérer: 2024-12-12 11:02:09
original
129 Les gens l'ont consulté

How Can `extern template` in C  11 Prevent Duplicate Template Instantiations and Reduce Compilation Time?

Utilisation d'un modèle extern pour éviter l'instanciation en C 11

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.

Modèles de fonctions

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
}
Copier après la connexion
// source1.cpp
#include "header.h"
void something1() {
    ReallyBigFunction<int>();
}
Copier après la connexion
// source2.cpp
#include "header.h"
extern template void ReallyBigFunction<int>();
void something2() {
    ReallyBigFunction<int>();
}
Copier après la connexion
Copier après la connexion

Sans modèle externe, le compilateur compilerait ReallyBigFunction dans source1.cpp et source2.cpp, ce qui donne les fichiers objets suivants :

source1.o
    void something1()
    void ReallyBigFunction<int>()    // Compiled first time

source2.o
    void something2()
    void ReallyBigFunction<int>()    // Compiled second time
Copier après la connexion

La liaison de ces fichiers ensemble entraînerait une copie de ReallyBigFunction étant supprimé, ce qui entraîne une perte de temps de compilation et de taille du fichier objet.

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

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
Copier après la connexion

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.

Modèles de classe

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();
};
Copier après la connexion
// source1.cpp
#include "header.h"
Foo<int> foo1;
Copier après la connexion
// source2.cpp
#include "header.h"
extern template class Foo<int>;
Foo<int> foo2;
Copier après la connexion

Sans modèle externe, le compilateur compilerait la fonction membre f pour Foo dans source1.cpp et source2.cpp, ce qui entraîne un code en double. L'utilisation d'un modèle externe garantit que la fonction membre n'est compilée qu'une seule fois.

Conclusion

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!

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