Alle C ++ - Compiler haben ein ernstes Leistungsproblem zu lösen. Das Kompilieren von C ++ - Code ist ein langer und langsamer Prozess.
Das Kompilieren von Headern, die über C ++ - Dateien enthalten sind, ist ein sehr langer und langsamer Prozess. Das Kompilieren der riesigen Header-Strukturen, die Teil der Windows-API und anderer großer API-Bibliotheken sind, ist ein sehr , sehr langer und langsamer Prozess. Es für jede einzelne Cpp-Quelldatei immer und immer wieder tun zu müssen, ist ein Todesstoß.
Dies gilt nicht nur für Windows, sondern ist ein altes Problem, mit dem alle Compiler konfrontiert sind, die mit einer großen API wie Windows kompilieren müssen.
Der Microsoft-Compiler kann dieses Problem mit einem einfachen Trick beheben, der als vorkompilierte Header bezeichnet wird . Der Trick ist ziemlich raffiniert: Obwohl jede CPP-Datei der Kette der Header-Dateien, die über jeder Cpp-Datei enthalten sind, möglicherweise und rechtlich eine geringfügig andere Bedeutung geben kann (z. B. indem vor dem Einschließen unterschiedliche Makros # definiert werden oder durch Einfügen der Überschriften in unterschiedlicher Reihenfolge) ist dies meistens nicht der Fall. Meistens sind Dutzende oder Hunderte von Dateien enthalten, aber alle sollen für alle in Ihrer Anwendung kompilierten Cpp-Dateien dieselbe Bedeutung haben.
Der Compiler kann enorm viel Zeit sparen, wenn er nicht jedes Mal mit dem Kompilieren jeder Cpp-Datei und seiner Dutzenden von Includes beginnen muss.
Der Trick besteht darin, eine spezielle Header-Datei als Ausgangspunkt für alle Kompilierungsketten festzulegen, die sogenannte "vorkompilierte Header" -Datei, die üblicherweise aus historischen Gründen eine Datei mit dem Namen stdafx.h ist .
Listen Sie einfach alle Ihre großen, riesigen Header für Ihre APIs in Ihrer stdafx.h-Datei in der entsprechenden Reihenfolge auf und starten Sie dann jede Ihrer CPP-Dateien ganz oben mit einem #include "stdafx.h"
vor aussagekräftigen Inhalten (fast das einzige, was vorher erlaubt ist) Bemerkungen).
Unter diesen Bedingungen beginnt der Compiler , anstatt von vorne zu beginnen , mit dem Kompilieren aus den bereits gespeicherten Ergebnissen des Kompilierens stdafx.h
.
Ich glaube nicht, dass dieser Trick nur für Microsoft-Compiler gilt, und ich glaube auch nicht, dass es sich um eine originelle Entwicklung handelt.
Bei Microsoft-Compilern wird die Einstellung, die die Verwendung vorkompilierter Header steuert, durch ein Befehlszeilenargument an den Compiler gesteuert : /Yu "stdafx.h"
. Wie Sie sich vorstellen können, ist die Verwendung des stdafx.h
Dateinamens lediglich eine Konvention. Sie können den Namen ändern, wenn Sie dies wünschen.
In Visual Studio 2010 wird diese Einstellung über die GUI gesteuert, indem Sie mit der rechten Maustaste auf ein CPP-Projekt klicken, "Eigenschaften" auswählen und zu "Konfigurationseigenschaften \ C / C ++ \ Vorkompilierte Header" navigieren. Bei anderen Versionen von Visual Studio ist der Speicherort in der GUI anders.
Beachten Sie, dass Ihr Programm nicht illegal wird, wenn Sie vorkompilierte Header deaktivieren (oder Ihr Projekt über ein Tool ausführen, das sie nicht unterstützt). Es bedeutet einfach, dass Ihr Tool jedes Mal alles von Grund auf neu kompiliert.
Wenn Sie eine Bibliothek ohne Windows-Abhängigkeiten erstellen, können Sie #include
s einfach auskommentieren oder aus der stdafx.h
Datei entfernen . Es ist nicht erforderlich, die Datei per se zu entfernen, aber Sie können dies natürlich auch tun, indem Sie die Einstellung für den vorkompilierten Header oben deaktivieren.