8 votes

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

Les grands projets basés sur des modèles sont lents à compiler, la STL étant l'un des principaux coupables semble-t-il d'après les preuves empiriques. Mais, pourquoi est-ce lent à compiler ?

J'ai optimisé des constructions avant en surveillant les inclusions d'en-tête et en combinant les unités de compilation, mais je ne comprends pas pourquoi les bibliothèques de modèles sont si lentes à compiler.

20voto

sbi Points 100828

En général, C++ est lent à compiler en raison du mécanisme d'inclusion ancien, qui oblige le compilateur à repérer de manière récurrente chaque en-tête avec toutes ses déclarations et définitions et tout ce qui est inclus dans chaque unité de traduction.

Les modèles ne font qu'exploiter cette "fonctionnalité". Mais ils nécessitent également que tout le code soit dans les en-têtes, obligeant le compilateur à repérer également toutes les implémentations de tous les modèles inclus.

6voto

Klaim Points 24511

Le code templatisé doit être considéré comme une autre langue pour générer du code C++.

Dans cette façon de penser, le code templatisé doit être analysé, exécuté, puis le compilateur peut générer du code C++ qui doit être ajouté au fichier unitaire actuel, et ensuite nous pouvons compiler tout le code C++.

J'ai entendu dire que tous les compilateurs ne le font pas exactement comme ça, mais c'est l'idée principale, et cela suppose qu'il se passe beaucoup plus de choses avant de compiler vraiment le code car une partie du code doit d'abord être générée.

1voto

Marcelo Cantos Points 91211

Une partie de la réponse se trouve dans votre question. Vous ne pouvez pas surveiller les inclusions d'en-tête avec les modèles, car l'implémentation complète doit être incluse dans chaque unité de compilation qui les utilise.

1voto

JohnMcG Points 5062

Pensez à ce qu'est un modèle réel - ce n'est pas une chose réelle, mais des instructions sur comment construire des choses réelles.

Dans le cas des modèles C++, le fichier d'en-tête ne contient pas un code réel, par exemple 'vector', mais des instructions sur comment construire un vector. Chaque fois que nous construisons un fichier source qui #include vector, le compilateur doit construire un nouveau code vector, peut-être plusieurs fois si nous instancions des vector 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 vector pour un autre fichier source, donc elle en construit un nouveau à chaque fois.

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