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::vectorund jede Quelldatei muss sich durch den kompletten template Kram wühlen (wenn du z.bstd::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.