extern template ist ein leistungsstarkes C 11-Schlüsselwort, mit dem Entwickler die Instanziierung einer Vorlage in einer bestimmten Kompilierungseinheit verhindern können . Dies kann besonders nützlich sein, wenn Sie mit großen Codebasen arbeiten, bei denen mehrere Quelldateien möglicherweise dieselbe Vorlage mit unterschiedlichen Parametern instanziieren, was zu doppeltem Code und längerer Kompilierungszeit führt.
Im Fall von Funktionsvorlagen, externe Vorlagen können verwendet werden, um den Compiler zu zwingen, eine bestimmte Vorlage nicht zu instanziieren, wenn er weiß, dass die Funktion an anderer Stelle instanziiert wird. Betrachten Sie das folgende Beispiel:
// 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>(); }
Ohne externe Vorlage würde der Compiler ReallyBigFunction
source1.o void something1() void ReallyBigFunction<int>() // Compiled first time source2.o void something2() void ReallyBigFunction<int>() // Compiled second time
Das Verknüpfen dieser Dateien würde zu einer Kopie von ReallyBigFunction
Um dieses Problem zu vermeiden, können wir eine externe Vorlage in source2.cpp verwenden:
// source2.cpp #include "header.h" extern template void ReallyBigFunction<int>(); void something2() { ReallyBigFunction<int>(); }
Dies führt zu den folgenden Objektdateien:
source1.o void something1() void ReallyBigFunction<int>() // Compiled just one time source2.o void something2() // No ReallyBigFunction<int> here because of the extern
Wenn diese Objektdateien verknüpft werden, verwendet die zweite Objektdatei das Symbol aus der ersten Objektdatei, wodurch doppelter Code vermieden und die Kompilierung reduziert wird Zeit.
Externe Vorlagen können auch mit Klassenvorlagen verwendet werden, um die Instanziierung bestimmter Klassenmitglieder zu verhindern. Zum Beispiel:
// 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;
Ohne externe Vorlage würde der Compiler die Memberfunktion f für Foo
Die externe Vorlage ist ein wertvolles Tool zur Vermeidung von doppeltem Code und zur Reduzierung der Kompilierungszeit in C 11-Projekten. Durch die selektive Verwendung externer Vorlagen, um unnötige Vorlageninstanziierungen zu verhindern, können Entwickler die Leistung ihres Codes optimieren.
Das obige ist der detaillierte Inhalt vonWie kann eine „externe Vorlage' in C 11 doppelte Vorlageninstanziierungen verhindern und die Kompilierungszeit verkürzen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!