7
votes

En C ++, pourquoi prend-il tellement de plus de temps à compiler beaucoup de fichiers plus petits que des fichiers plus importants?

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?

Est-ce un résultat direct de devoir inclure quelques en-têtes dans de nombreux dossiers par opposition à quelques-uns?

Options de Comiler:

g ++ -wall -wextra -g -ggdb -std = c ++ 0x

La taille exécutable que je fais référence à la suite est après avoir exécutable des bandes exécutables.

tailles:

Avant avec les symboles de débogage: 16 Mo

Après avec les symboles de débogage: 26 Mo

Avant sans symboles de débogage: 1,5 Mo

Après sans symboles de débogage: 2,4 Mo

Question supplémentaire:

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.


3 commentaires

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?


3 Réponses :


1
votes

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.


0 commentaires

11
votes

Il y a plusieurs raisons pour lesquelles cela pourrait arriver, voici un cerveau d'hérissé:

  • Accès de disque plus lent (probablement pas la cause d'une telle augmentation)
  • Unités de traduction multiples, y compris les mêmes en-têtes, ces en-têtes sont collés dans chacun d'entre eux. Les en-têtes sont également pré-traités à chaque fois. ( cause la plus probable )
  • Variables statiques ou fonctions définies dans les en-têtes sont dupliqués dans chaque unité de traduction
  • Symboles pour les modèles sont générés pour chaque unité de traduction qui les spécialisent

    Voici certaines choses qui peuvent vous aider à sortir - conservez plusieurs fichiers mais réduisez le temps de compilation:

    • en-têtes précompilés
    • Builds bulk - exclude CPP de la construction mais les incluent dans un fichier de mise en œuvre différent compilé.

3 commentaires

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.



0
votes

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.

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.


0 commentaires