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
Patricia ArquetteOriginal
2024-12-12 11:02:09194Durchsuche

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
}
// 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 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

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

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.

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

Stellungnahme:
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