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
Patricia Arquetteoriginal
2024-12-12 11:02:09195parcourir

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

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

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>();
}

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

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

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!

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