J'ai récemment divisé certains fichiers très volumineux dans mon projet C ++ dans de nombreux fichiers plus petits (fondamentalement un fichier par classe). Cela a encore doublé le temps de compilation et a également élargi l'exécutable résultant de 1,6 Mo à 2,4 Mo. Pourquoi cela a-t-il fait une telle différence? P>
Est-ce un résultat direct de devoir inclure quelques en-têtes dans de nombreux dossiers par opposition à quelques-uns? P>
g ++ -wall -wextra -g -ggdb -std = c ++ 0x p>
La taille exécutable que je fais référence à la suite est après avoir exécutable des bandes exécutables. p>
Avant avec les symboles de débogage: 16 Mo P>
Après avec les symboles de débogage: 26 Mo P>
Avant sans symboles de débogage: 1,5 Mo p>
Après sans symboles de débogage: 2,4 Mo P>
J'utilise déjà des en-têtes précompilés en mettant les en-têtes dans un PCH.HPP, puis à l'aide de l'option -include pCH.PP dans mes drapeaux G ++. Est-ce la manière optimale de le faire avec GCC? Il semble avoir un impact très minimal sur les temps de compilation. Les seuls en-têtes ne sont actuellement pas précompilés sont en dehors du projet et sous réserve de changement à mesure que le projet est sous un développement important. P>
3 Réponses :
Ceci typiquement parce que vous compilez beaucoup d'en-têtes de système pendant chaque unité de compilation. Il existe également une surcharge mineure associée à la liaison de tous les fichiers d'objet ensemble. P>
Il y a plusieurs raisons pour lesquelles cela pourrait arriver, voici un cerveau d'hérissé: p>
Voici certaines choses qui peuvent vous aider à sortir - conservez plusieurs fichiers mais réduisez le temps de compilation: P>
CPP code> de la construction mais les incluent dans un fichier de mise en œuvre différent compilé. LI>
ul>
En bulk Build, assurez-vous de combiner efficacement les fichiers .CPP uniquement pour le processus de construction uniquement pour accélérer la construction?
@Troy oui. Y compris eux dans un seul fichier CPP pour accélérer la construction, et pourtant les garder séparément.
Merci, je viens de tester les fichiers fautifs de Cat'ing. CPPP dans une bulk.cpp et la compilation et c'est incroyablement plus rapide que des fichiers distincts. Très appréciée.
Utilisez un système de construction (tel que CUMAKE ou GNU.
the idiome pimpl peut aider à réduire le nombre de fichiers d'en-tête "secondaires" Besoin d'être inclus dans un fichier d'en-tête, en raison des membres privés d'une classe. Je ne pense pas que cet idiome réduira l'heure d'une reconstruction complète, mais cela devrait aider à réduire le temps d'une construction incrémentielle lorsque vous modifiez les membres privés d'une classe. P>
J'aime utiliser PIMPL pour les classes faisant partie de l'interface visible d'une bibliothèque ou d'un package. Je ne m'embête pas avec Pimpl pour les classes "internes" ou des classes qui agissent comme des types de valeur. P>
Vous êtes-vous assuré de mettre autant que possible dans le fichier .CPP le plus possible?
Activer -flto et réessayer. Vous créez de nombreux objets maintenant. Cela augmente la maintenabilité mais rend plus difficile l'optimisation des compilateurs. -Le offre une option d'optimisation de l'optimisation des objets
Utilisez-vous un système de construction (tel que CMAKE) pour effectuer des constructions incrémentielles?