Les grands projets modèles sont lents à compiler, le STL étant un coupable principal de celui-ci semble de la preuve empirique. Mais pourquoi est-il lent à compiler? P>
J'ai des constructions optimisées avant en regardant l'en-tête inclut et en combinant des unités de compilation, mais je ne comprends pas pourquoi les bibliothèques de modèles sont assez lentes à compiler. P>
4 Réponses :
Une partie de la réponse est dans votre question. Vous ne pouvez pas surveiller l'en-tête inclut avec des modèles, car la mise en œuvre complète doit être incluse dans chaque unité de compilation qui les utilise. P>
C ++ en général est lent à compiler en raison de l'ancien mécanisme, ce qui entraîne le compilateur de répartir récursivement chaque en-tête avec toutes ses déclarations et toutes ses définitions et tout ce qui est inclus pour chaque unité de traduction em>. p>
Les modèles construisent simplement sur cette "fonctionnalité". Mais ils ont besoin de tous code em> dans des en-têtes, forçant également le compilateur pour répartir également toutes les implémentations em> de tous les modèles inclus. P>
Lorsque vous votez une réponse pour les premières fois, une boîte apparaît pour vous demander d'expliquer pourquoi vous l'avez fait. Après un moment, cela n'arrive plus. Cependant, cela n'est pas parce que vous ne devriez plus expliquer les votes en bas, mais parce que vous devez le savoir à ce moment-là. Pour le dire audacieusement: Vous devez toujours expliquer pourquoi vous avez basculé. B>
Pas sûr, mais peut-être qu'un fanboy de c est passé et pensé "L'ancien inclus de mécanisme est fin, c compare assez rapidement avec elle"
Les en-têtes précompilés aident à résoudre ce problème - vous pouvez avoir la totalité de la STL précompilite, de sorte que ce n'est qu'une fois analysé une fois lors de la compilation d'un projet.
@ShasleysBrain: Mais vous finissez par avoir toute la bibliothèque standard (dont la STL, BTW, n'est qu'une partie) incluse partout. La virale inclut la prolifération de PCH m'a fait les détester. Si vous utilisez GCC, DISTGCC (ou toutefois, il est orthographié) est une meilleure solution; Sous Windows, il est [ xoreax.com] (incrémentibuild) .
Je suis vraiment d'accord avec cette bulletin de vote ... Quoi qu'il en soit, je pense que les modules sont toujours pris en compte pour la norme suivante (après C ++ 0x). Notez également que les en-têtes précompilés ne veulent pas dire avec tout, en regardant Clang (et la possibilité de sérialiser des asts), il devrait être possible d'éviter la phase d'analyse (le plus lent de tous), je serais vraiment intéressé par cela.
Cette réponse n'est qu'une réponse partielle. Il ne s'adresse pas à la lenteur de modèle qui se produit lorsqu'un modèle n'est pas inclus plusieurs fois ou n'est défini que dans un fichier CPP.
Le code modélisé doit être pris comme une autre langue pour générer du code C ++. P>
Dans cette façon de penser, le code modélisé doit être analysé, exécuté, puis le compilateur peut générer du code C ++ qui doit être ajouté au fichier d'unité actuel, puis nous pouvons compiler tout le code C ++. P>
J'ai entendu dire que tous les compilateurs ne le font pas exactement, mais c'est l'idée principale et que cela suppose qu'il y ait beaucoup plus d'événement avant de réellement compiler le code, car une partie du code doit être générée en premier. P>
Il est lent car les écrivains de GCC et probablement VC ++ ne se soucient pas de réutiliser les spécialisations du modèle et, étant donné que la norme est pleine de modèles si vous utilisez un std :: vecteur
@Martinkosicky Pourquoi générerait-il le code peut causer une telle lenteur dans la compilation?
@Piepi parce que même si O (10n) et O (n) sont considérés comme les mêmes que je les appelais 10 fois plus lent. C'est ce qui se passe si vous utilisez STD :: basic_string
Pensez à ce qu'est un modèle de monde réel - ce n'est pas une chose réelle, mais les instructions sur la manière de construire des choses réelles. P>
Dans le cas des modèles C ++, le fichier d'en-tête ne contient pas de réel, par exemple. 'Vecteur', mais instructions sur la construction d'un vecteur code> code>. Chaque fois que nous construisons un fichier source que La construction de chaque fichier source est indépendante et ne sait pas si vous avez déjà construit un #include code> s
vecteur code> s avec différents paramètres de modèle. P>
vecteur code> pour un autre fichier source, il en découlant une nouvelle à chaque fois. P>