Tous les compilateurs C ++ ont un sérieux problème de performances à résoudre. La compilation de code C ++ est un processus long et lent.
La compilation des en-têtes inclus au-dessus des fichiers C ++ est un processus très long et lent. La compilation des énormes structures d'en-tête qui font partie de l'API Windows et d'autres grandes bibliothèques d'API est un processus très , très long et lent. Devoir le faire encore et encore et encore et encore pour chaque fichier source Cpp est un glas.
Ce n'est pas unique à Windows, mais un vieux problème rencontré par tous les compilateurs qui doivent compiler avec une grande API comme Windows.
Le compilateur Microsoft peut améliorer ce problème avec une astuce simple appelée en- têtes précompilés . L'astuce est assez astucieuse: bien que chaque fichier CPP puisse potentiellement et légalement donner une signification légèrement différente à la chaîne de fichiers d'en-tête inclus au-dessus de chaque fichier Cpp (par des choses comme avoir différentes macros # définies avant les inclusions, ou en incluant les en-têtes dans un ordre différent), ce qui n’est le plus souvent pas le cas. La plupart du temps, nous avons des dizaines ou des centaines de fichiers inclus, mais ils sont tous destinés à avoir la même signification pour tous les fichiers Cpp en cours de compilation dans votre application.
Le compilateur peut faire d'énormes gains de temps s'il n'a pas à commencer à compiler chaque fichier Cpp plus ses dizaines d'inclusions littéralement à partir de zéro à chaque fois.
L'astuce consiste à désigner un fichier d'en-tête spécial comme point de départ de toutes les chaînes de compilation, le fichier dit «en-tête précompilé», qui est généralement un fichier nommé stdafx.h simplement pour des raisons historiques.
Listez simplement tous vos gros en-têtes énormes pour vos API dans votre fichier stdafx.h, dans l'ordre approprié, puis démarrez chacun de vos fichiers CPP tout en haut avec un #include "stdafx.h"
, avant tout contenu significatif (à peu près la seule chose autorisée avant est commentaires).
Dans ces conditions, au lieu de partir de zéro , le compilateur commence à compiler à partir des résultats déjà enregistrés de tout compiler stdafx.h
.
Je ne pense pas que cette astuce soit propre aux compilateurs Microsoft, et je ne pense pas non plus que ce soit un développement original.
Pour les compilateurs Microsoft, le paramètre qui contrôle l'utilisation des en- têtes précompilés est contrôlé par un argument de ligne de commande pour le compilateur: /Yu "stdafx.h"
. Comme vous pouvez l'imaginer, l'utilisation du stdafx.h
nom de fichier est simplement une convention; vous pouvez changer le nom si vous le souhaitez.
Dans Visual Studio 2010, ce paramètre est contrôlé à partir de l'interface graphique via un clic droit sur un projet CPP, en sélectionnant «Propriétés» et en naviguant vers «Propriétés de configuration \ C / C ++ \ En-têtes précompilés». Pour les autres versions de Visual Studio, l'emplacement dans l'interface graphique sera différent.
Notez que si vous désactivez les en-têtes précompilés (ou exécutez votre projet via un outil qui ne les prend pas en charge), cela ne rend pas votre programme illégal; cela signifie simplement que votre outil compilera tout à partir de zéro à chaque fois.
Si vous créez une bibliothèque sans dépendances Windows, vous pouvez facilement mettre en commentaire ou supprimer des #include
s du stdafx.h
fichier. Il n'est pas nécessaire de supprimer le fichier en soi, mais vous pouvez clairement le faire également en désactivant le paramètre d'en-tête de précompilation ci-dessus.