8
votes

Pourquoi les modèles sont-ils si lents à compiler?

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?

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.


0 commentaires

4 Réponses :


1
votes

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.


0 commentaires

19
votes

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 .

Les modèles construisent simplement sur cette "fonctionnalité". Mais ils ont besoin de tous code dans des en-têtes, forçant également le compilateur pour répartir également toutes les implémentations de tous les modèles inclus.


6 commentaires

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é.


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.



5
votes

Le code modélisé doit être pris comme une autre langue pour générer du code C ++.

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 ++.

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.


3 commentaires

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 dans 10 fichiers tout ce processus se passe 10 fois . Qui tue cette langue


@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



1
votes

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.

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 . Chaque fois que nous construisons un fichier source que #include s , le compilateur doit construire un nouveau code vecteur , peut-être plusieurs fois si nous Instanciant vecteur s avec différents paramètres de modèle.

La construction de chaque fichier source est indépendante et ne sait pas si vous avez déjà construit un vecteur pour un autre fichier source, il en découlant une nouvelle à chaque fois.


0 commentaires