81 votes

#include tous les fichiers .cpp dans une seule unité de compilation?

J'ai récemment eu l'occasion de travailler avec certains de Visual Studio C++ projets avec l'habitude Debug et Release configurations, mais aussi la Libération de Tous " et "Debug Tous", dont je n'avais jamais vu avant.

Il s'avère que l'auteur de projet a un seul ALL.cpp qui #inclut tous les autres .fichiers cpp. *Toutes les configurations de construire tout cela une ALL.cpp fichier. Il est bien sûr exclu de l'configurations régulières, et des configurations régulières de ne pas construire de ALL.cpp

Je me demandais si c'était une pratique courante? Quels avantages apporte-t-il? (Ma première réaction a été qu'il sentait mauvais.)

Quels types de pièges, vous êtes susceptible de rencontrer avec cette? Je peux penser est que si vous avez anonyme des espaces de noms dans votre .les cpp, ils n'en ont plus "privé" pour que la rpc, mais maintenant visibles dans d'autres cpp?

Tous les projets de construire Dll, afin d'avoir des données dans anonyme espaces de noms ne serait pas une bonne idée, non? Mais les fonctions seraient OK?

Des acclamations.

66voto

MSN Points 30386

Il est appelé par quelques-uns (et google) comme une "Unité de construction". Il relie incroyablement rapide et compile assez rapidement. Il est idéal pour les builds que vous n'avez pas besoin d'itérer sur, comme un communiqué de construire à partir d'un serveur central, mais il n'est pas nécessairement le cas pour la construction incrémentale.

Et c'est un pain PITA à maintenir.

EDIT: voici le premier lien google pour plus d'info: http://buffered.io/posts/the-magic-of-unity-builds/

La chose qui le rend rapide, c'est que le compilateur seulement besoin de lire tout à la fois, de compiler, puis lien, plutôt que de le faire pour tous .fichier cpp.

Bruce Dawson est beaucoup mieux d'écrire à ce sujet sur son blog: http://randomascii.wordpress.com/2014/03/22/make-vc-compiles-fast-through-parallel-compilation/

63voto

Bruce Dawson Points 240

L'unité s'appuie l'amélioration de construire des vitesses pour trois raisons principales. La première raison est que tous le partage des fichiers d'en-tête seulement besoin d'être analysée à la fois. De nombreux projets C++ avez beaucoup de fichiers d'en-tête qui sont inclus par la plupart ou tous les fichiers CPP et redondant de l'analyse de ces est le principal coût de compilation, surtout si vous avez de nombreux fichiers à la source. Les fichiers d'en-tête précompilé peut aider avec ce coût, mais généralement il y a beaucoup de fichiers d'en-tête qui ne sont pas précompilés.

La prochaine raison principale que l'unité s'appuie améliorer construire des vitesses est parce que le compilateur est invoquée de moins en moins de temps. Il y a quelques coût de démarrage d'invoquer le compilateur.

Enfin, la réduction de la redondante en-tête d'analyse implique une diminution de code redondant-gen pour les fonctions inline, donc la taille totale des fichiers de l'objet est plus petit, ce qui permet de faire des liens plus rapide.

L'unité s'appuie pouvez également donner un code de meilleure qualité-gen.

L'unité s'appuie sont PAS plus rapide en raison de la réduction de disque I/O. j'ai profilé de nombreuses construit avec xperf et je sais de quoi je parle. Si vous avez suffisamment de mémoire alors le système d'exploitation de disque cache d'éviter les e/S redondantes - les lectures suivantes d'un en-tête viendra de l'OS de cache disque. Si vous n'avez pas assez de mémoire, puis l'unité s'appuie pourrait même faire construire des fois pire en provoquant le compilateur de la mémoire à dépasser la mémoire disponible et obtenir paginées.

Disk I/O est cher, c'est pourquoi tous les systèmes d'exploitation agressivement mettre en cache des données afin d'éviter toute redondance des e/s disque.

7voto

Arafangion Points 5650

Je me demande si c'ALL.cpp il est tentant de mettre l'ensemble du projet au sein d'une seule unité de compilation, pour améliorer la capacité pour le compilateur d'optimiser le programme pour la taille?

Normalement quelques optimisations ne sont exécutées au sein des différentes unités de compilation, telles que la suppression de code en double et inline.

Cela dit, il me semble me rappeler que les derniers compilateurs (Microsoft, Intel, mais je ne pense pas que cela comprend GCC) peut faire cette optimisation sur plusieurs unités de compilation, donc je pense que ce "truc" est inutile.

Cela dit, il serait curieux de voir si il n'y a en effet aucune différence.

3voto

spforay Points 1

Je suis d'accord avec Bruce; à partir de mon expérience, j'avais essayé la mise en œuvre de l'Unité de Construire pour l'un de mes .dll projets qui avaient une tonne d'en-tête comprend et beaucoup de .les cpp; mettre à bas l'ensemble du temps de Compilation sur la VS2010(a déjà épuisé les Différentiels options de compilation), mais plutôt que de couper vers le bas le temps de Compilation, j'ai couru hors de la mémoire et de la construction même pas en mesure de terminer la Compilation.

Cependant à ajouter; je n'ai trouver l'activation du Multi-Processeur option de Compilation dans Visual Studio assez aide à abattre les temps de Compilation; je ne suis pas sûr si une telle option est disponible sur d'autres plate-forme de compilateurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X