Heim > Backend-Entwicklung > C++ > Wie kann eine „externe Vorlage' in C 11 doppelte Vorlageninstanziierungen verhindern und die Kompilierungszeit verkürzen?

Wie kann eine „externe Vorlage' in C 11 doppelte Vorlageninstanziierungen verhindern und die Kompilierungszeit verkürzen?

Patricia Arquette
Freigeben: 2024-12-12 11:02:09
Original
129 Leute haben es durchsucht

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

Verwenden einer externen Vorlage zur Vermeidung der Instanziierung in C 11

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.

Funktionsvorlagen

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

Ohne externe Vorlage würde der Compiler ReallyBigFunction kompilieren. sowohl in source1.cpp als auch in source2.cpp, was zu den folgenden Objektdateien führt:

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

source2.o
    void something2()
    void ReallyBigFunction<int>()    // Compiled second time
Nach dem Login kopieren

Das Verknüpfen dieser Dateien würde zu einer Kopie von ReallyBigFunction führen. werden verworfen, was Kompilierzeit und Objektdateigröße verschwendet.

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>();
}
Nach dem Login kopieren
Nach dem Login kopieren

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
Nach dem Login kopieren

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.

Klassenvorlagen

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

Ohne externe Vorlage würde der Compiler die Memberfunktion f für Foo kompilieren. sowohl in source1.cpp als auch in source2.cpp, was zu doppeltem Code führt. Durch die Verwendung einer externen Vorlage wird sichergestellt, dass die Mitgliedsfunktion nur einmal kompiliert wird.

Fazit

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage