Explizite Instantiierung von Templates



  • Hallo Leute,

    ich versuche folgende Absätze aus dem Buch zu verstehen, leider lese ich nur Hausnummern..

    Die explizite Instantiierung wird gewöhnlich für die Erstellung von
    Bibliotheken verwendet, wenn Klassen- bzw. Funktions-Templates nur für
    andere Übersetzungseinheiten zur Verfügung gestellt werden.
    
    Wurde also ein Klassen- oder Funktions-Template explizit instantiiert,
    so müssen Sie in einer anderen Übersetzungseinheit (Modul) nur eine
    einfache Deklaration verwenden, um die Funktion bzw. Klasse zu verwenden.
    Eine Solche Deklaration stellt man gewöhnlich in eine Header-Datei wie
    zum Beispiel:
    
    #include “array.h”
    //explizite instantiierung
    
    template class Array<int>;
    template class Array<char>;
    
    Durch diese Vorgehensweise können Sie verhindern, dass einzelne Klassen- bzw.
    Funktions-Templates in verschiedenen Modulen mehrmals generiert werden (wobei
    der Linker diese “Verdoppelung” später wieder entfernt). Und der Teil eines
    Klassen Templates, in dem sich die Definition von Methoden und statischen
    Elementen befindet, muss nur in dem Modul vorhanden sein, in dem die Instanzen
    der klassen generiert werwden.
    

    Ich tue mir sehr schwer diesen Text zu verstehen.. ich weiß was die einzelnen Begriffe wie "implizit" usw. bedeuten aber es fällt mir schwer einen tieferen Sinn aus diesen Sätzen zu herauszuholen und warum es nicht auch einfach mit impliziten Templates klappt.

    Vielleicht lässt es sich auch einfacher beschreiben.

    Wäre dankbar wenn Jemand der sich damit auskennt mal ein paar Sätze dazu niederschreibt.



  • Explizite Instanzierung ist sozusagen eine Optiemierung, mit der du vermeiden kannst, dass templates mehrfach vom compiler aufgelöst werden müssen.

    Stell dir dazu einfach vor, dass du z.B mehrere Quelldateien hast (im gleichen Projekt) und jede inkludiert z.B std::vector und jede Quelldatei muss sich durch den kompletten template Kram wühlen (wenn du z.b std::vector<int> benutzt). Das ist doch recht viel Arbeit und es würde reichen, wenn das template einmal aufgelöst würde. Mit der expliziten Instanzierung kannst du genau das erreichen.



  • drakon schrieb:

    ...

    Das heisst dass dann zwar ich in jeder Header Datei die std::vector<int> verwendet wird aber tatsächlich nur einmal als Funktion generiert wird?



  • Verstehe deine Frage nicht..

    Du kannst dir das so vorstellen, dass der Compiler da bei de expliziten Instanzierung einfach die komplette Klasse mit dem angegebenen Typen erstellt.


Anmelden zum Antworten