2009-03-27 5 views
37

Quels sont les meilleurs candidats pour un fichier d'en-tête précompilé? Puis-je mettre des en-têtes STL et Boost là, même s'ils ont des modèles? Et cela réduira-t-il les temps de compilation? En outre, quels sont les meilleurs paramètres IDE pour réduire les temps de compilation?Que mettre dans l'en-tête précompilé? (MSVC)

+3

Je préfère ne pas utiliser PCH. Les raisons sont (1) J'aime que la première inclusion dans un fichier cpp soit son en-tête correspondant donc vous savez que l'entête compile (2) mon expérience est que le chec de dépendances avec pch n'est pas entièrement fiable, et cela entraîne des constructions incrémentales devenues peu fiables dans de très grands projets. À mon avis, il est plus efficace sur l'équilibre de ne pas utiliser pch et profiter des avantages de constructions incrémentielles fiables. Cela pourrait ne plus être le cas avec les versions les plus récentes de Visual Studio - mon expérience avec ce n'est pas encore suffisant pour juger. – Permaquid

Répondre

47

La réponse rapide: les en-têtes STL et Boost appartiennent en effet au fichier d'en-tête précompilé, même si ces fichiers d'en-tête définissent des classes de modèles.

Lors de la génération d'un fichier d'en-tête précompilé, un compilateur analyse le texte d'en-tête (une tâche importante!) Et le convertit en un format binaire optimisé pour le bénéfice du compilateur.

Même si les classes de modèles seront instanciées lors de la compilation d'autres fichiers .cpp, elles seront instanciées à partir des informations de l'en-tête précompilé, ce qui est beaucoup plus rapide à lire pour le compilateur.


(plus tard plus)

Une chose que vous devriez pas inclure dans un en-tête précompilés sont des fichiers qui font partie de votre projet et sont changés fréquemment, même si chaque fichier .cpp comprend ces fichiers.

La raison est la suivante: la génération de l'en-tête précompilé peut prendre beaucoup de temps, car les bibliothèques boost, stl et windows sont très volumineuses.

Vous pourriez avoir un fichier simple (par exemple "StringDefs.h") que tout utilise. Si StringDefs.h est inclus dans stdafx.h, et qu'un développeur touche StringDefs.h, alors chaque développeur doit attendre jusqu'à ce que l'en-tête précompilé au complet recompile. Ce serait beaucoup plus rapide si StringDefs.h était exclu de l'en-tête précompilé et analysé avec chaque fichier .CPP.

+0

C'est un bon point - y compris changer fréquemment de fichiers ralentirait le temps de construction, dans l'ensemble. – Andy

+4

Vous ne pouvez avoir qu'un fichier d'en-tête précompilé par fichier .cpp, mais vous pouvez avoir plusieurs en-têtes précompilés dans votre projet. –

+1

Vous devez non seulement attendre que PCH soit recompilé, mais également pour chaque fichier qui l'utilise. –

-1

Mettez n'importe quoi dans l'en-tête précompilé que la plupart des fichiers .cpp de ce projet incluraient quand même. Cela vaut pour tout fichier d'en-tête, vraiment. Cela permet au compilateur d'analyser ces fichiers une fois, puis de réutiliser ces informations dans tous les fichiers .cpp du même projet.

+2

Je ne suis pas d'accord, et j'ai écrit une section supplémentaire dans ma réponse pour expliquer pourquoi. –

+0

les en-têtes précompilés devraient * jamais * inclure les en-têtes locaux du projet – Tom

+0

J'ai beaucoup travaillé sur un projet qui a suivi ce conseil erroné et c'est très inefficace - chaque fois que vous compilez, tout compile pour tout changement. – Permaquid

6

Un ajout à la réponse d'Andrew Shepherd. Utilisez l'en-tête précompilé pour les fichiers d'en-tête externes à votre projet, pour les fichiers qui changent rarement. Si vous modifiez en permanence les fichiers d'en-tête du projet en cours, cela ne vaut probablement pas la peine de les précompiler.

3

J'ai écrit un article sur les techniques qui réduisent le temps de compilation. Parmi ces techniques, un article sur l'en-tête précompilé et son application peut être trouvé here. Il contient également une section sur les meilleures pratiques que vous pourriez trouver intéressantes. Les scripts CMake qui le gèrent de manière transparente sont inclus.

Questions connexes