Vergleichen von Headereinheiten, Modulen und vorkompilierten Headern

Historisch gesehen fügen Sie die Standardbibliothek mit einer Direktive wie #include <vector>. Es ist jedoch teuer, Headerdateien einzuschließen, da sie von jeder Quelldatei verarbeitet werden, die sie enthält.

Vorkompilierte Header (PCH) wurden eingeführt, um die Kompilierung zu beschleunigen, indem sie einmal übersetzt und das Ergebnis wiederverwenden. Vorkompilierte Kopfzeilen können jedoch schwierig Standard sein.

In C++20 wurden Module als erhebliche Verbesserung bei Headerdateien und vorkompilierten Headern eingeführt.

Headereinheiten wurden in C++20 eingeführt, um die Lücke zwischen Headerdateien und Modulen vorübergehend zu überbrücken. Sie bieten einige der Vorteile der Geschwindigkeit und Robustheit von Modulen, während Sie Ihren Code zur Verwendung von Modulen migrieren.

Anschließend hat die C++23-Standardbibliothek Unterstützung für den Import der Standardbibliothek als benannte Module eingeführt. Dies ist die schnellste und robusteste Methode, um die Standardbibliothek zu nutzen.

Um die verschiedenen Optionen zu sortieren, vergleicht dieser Artikel die herkömmliche #include Methode mit vorkompilierten Headern, Kopfzeileneinheiten und dem Importieren benannter Module.

Die folgende Tabelle ist nach Compilerverarbeitungsgeschwindigkeit und Robustität angeordnet, wobei #include die langsamste und am wenigsten robust ist und import die schnellste und robusteste ist.

Methode Zusammenfassung
#include Ein Nachteil besteht darin, dass sie Makros und interne Implementierungen verfügbar machen. Die interne Implementierung wird häufig als Funktionen und Typen verfügbar gemacht, die mit einem Unterstrich beginnen. Dies ist eine Konvention, die darauf hinweist, dass etwas Teil der internen Implementierung ist und nicht verwendet werden sollte.

Headerdateien sind zerbrechlich, da die Reihenfolge von #includes Verhalten ändern oder Code unterbrechen kann und von Makrodefinitionen betroffen sind.

Kopfzeilendateien langsam kompilieren. Insbesondere, wenn mehrere Dateien dieselbe Datei enthalten, da die Headerdatei mehrmals verarbeitet wird.
Vorkompilierter Header Ein vorkompilierter Header (PCH) verbessert die Kompilierungszeit, indem ein Compilerspeicher Momentaufnahme einer Reihe von Headerdateien erstellt wird. Dies ist eine Verbesserung beim wiederholten Neuerstellen von Headerdateien.

PCH-Dateien haben Einschränkungen, die es schwierig machen, sie zu Standard tain.

PCH-Dateien sind schneller als #include aber langsamer als import.
Kopfzeileneinheiten Dies ist ein neues Feature in C++20, mit dem Sie Headerdateien mit einem gut verhaltenen Verhalten als Module importieren können.

Kopfzeileneinheiten sind schneller als #include, und sind einfacher zu Standard, deutlich kleiner und auch schneller als vorkompilierte Headerdateien (PCH).

Kopfzeileneinheiten sind ein "Zwischenschritt", der den Übergang zu benannten Modulen in Fällen erleichtern soll, in denen Sie auf Makros angewiesen sind, die in Headerdateien definiert sind, da benannte Module Keine Makros verfügbar machen.

Kopfzeileneinheiten sind langsamer als das Importieren eines benannten Moduls.

Kopfzeileneinheiten sind von Makros nicht betroffen, es sei denn, sie werden in der Befehlszeile angegeben, wenn die Kopfzeileneinheit integriert ist, sodass sie robuster als Headerdateien sind.

Headereinheiten machen die Makros und die interne Implementierung verfügbar, die in ihnen genauso wie die Headerdatei definiert sind, was benannte Module nicht tun.

Als grobe Annäherung an die Dateigröße kann eine 250-Megabyte-PCH-Datei durch eine 80-Megabyte-Headereinheitsdatei dargestellt werden.
Module Dies ist die schnellste und robusteste Methode zum Importieren von Funktionen.

Unterstützung für das Importieren von Modulen wurde in C++20 eingeführt. Die C++23-Standardbibliothek führt die beiden benannten Module ein, die in diesem Thema beschrieben werden.

Beim Importieren stderhalten Sie die Standardnamen wie std::vector, std::coutaber keine Erweiterungen, keine internen Hilfsprogramme wie _Sort_unchecked, und keine Makros.

Die Reihenfolge der Importe spielt keine Rolle, da keine Makro- oder andere Nebenwirkungen vorhanden sind.

Als grobe Annäherung an die Dateigröße kann eine 250-Megabyte-PCH-Datei durch eine 80-Megabyte-Headereinheitsdatei dargestellt werden, die durch ein 25-Megabyte-Modul dargestellt werden kann.

Benannte Module sind schneller, da der Compiler beim Kompilieren eines benannten Moduls in eine .ifc Datei und eine .obj Datei eine strukturierte Darstellung des Quellcodes ausgibt, der beim Importieren des Moduls schnell geladen werden kann. Der Compiler kann einige Arbeit (z. B. die Namensauflösung) ausführen, bevor die .ifc Datei aufgrund der Art und Art, wie benannte Module sortiert und makrounabhängig sind, auszugeben, sodass diese Arbeit nicht ausgeführt werden muss, wenn das Modul importiert wird. Im Gegensatz dazu muss der Inhalt bei Verwendung #includeeiner Headerdatei in jeder Übersetzungseinheit vorverarbeitet und erneut kompiliert werden.

Vorkompilierte Header, die Compilerspeicher Momentaufnahme s sind, können diese Kosten mindern, aber nicht ebenso wie benannte Module.

Wenn Sie C++20-Features und die C++23-Standardbibliothek in Ihrer App verwenden können, verwenden Sie benannte Module.

Wenn Sie C++20-Features verwenden können, aber im Laufe der Zeit zu Modulen wechseln möchten, verwenden Sie Kopfzeileneinheiten in der Zwischenzeit.

Wenn Sie keine C++20-Features verwenden können, sollten Sie vorkompilierte Header verwenden #include und in Betracht ziehen.

Siehe auch

Vorkompilierte Headerdateien
Übersicht über Module in C++
Lernprogramm: Importieren der C++-Standardbibliothek mithilfe von Modulen
Exemplarische Vorgehensweise: Importieren von STL-Bibliotheken als Headereinheiten
Exemplarische Vorgehensweise: Erstellen und Importieren von Headereinheiten in Ihren Visual C++-Projekten