12
votes

Quand l'instanciation de gabarit est-elle en pratique dans la pratique?

Il semble que, dans C ++ et D, les langues statiquement compilées et dans lesquelles des métaprogrammations de modèle sont une technique populaire, il existe une quantité décente de préoccupation concernant l'instanciation de gabarit. Il me semble principalement une préoccupation théorique, sauf sur des systèmes embarqués très contraignants. En dehors de l'espace intégré, je n'ai pas encore entendu parler d'un exemple de quelqu'un de pouvoir démontrer que c'était un problème dans la pratique.

Quelqu'un peut-il offrir un exemple en dehors des systèmes embarqués sévèrement limités de ressources de l'instanciation de gabarits BLOAT Compatible dans la pratique et avait Effets négatifs pratiquement significatifs


0 commentaires

5 Réponses :


3
votes

Je pense que vous devrez trouver un plus ancien compilateur pour voir le code de modèle de gonflement dans la pratique. Les compilateurs C ++ modernes (et les liants) ont été en mesure de l'optimiser pendant un moment.


0 commentaires

2
votes

Je pense que c'est principalement mental mental. Le prochain programmeur pour travailler sur votre code devra d'abord comprendre quel sous-ensemble compter cela.


0 commentaires

7
votes

BLOFT MEMPLATEUR est NON Un problème (c'est un problème mental, pas un problème de code).

Oui, il peut devenir grand. Mais quelle est l'alternative?
Vous pouvez écrire tout le code vous-même manuellement (une fois pour chaque type). Pensez-vous l'écriture manuellement le rendra plus petit. Le compilateur instanciate uniquement les versions dont il a besoin et que la liaison éliminera plusieurs copies réparties sur les unités de compilation.

Donc il n'y a pas de gonflement réel.
Il s'agit juste de construire ce que vous utilisez. Si vous utilisez beaucoup de types différents, vous devez écrire plus de code.


3 commentaires

Ce n'est pas tout à fait vrai - le compilateur peut générer du code identique pour les différentes fonctions f (signé int) et f (non signé INT) et ne remarquera probablement pas qu'ils sont identiques. Alors que l'écrire manuellement, vous n'obtiendrez qu'une de ces fonctions.


Idéalement, vous devez utiliser un compilateur / lieur qui reconnaît et supprime le code de montage généré en double. Visual Studio fait cela (comdat pliant).


Ceci est vrai si vous utilisez simplement des modèles comme génériques. Mais ce n'est pas vrai si vous faites des métaprogrammants avec des modèles. Les modèles utilisés dans la métaprogrammation peuvent instantifier toutes sortes de types intermédiaires fous que vous n'avez pas vraiment besoin. Je pense que le générateur d'analyseurs Spirit Spirit peut être un bon exemple.



10
votes

Il y a peu de problème en C ++, car la quantité de modèle que vous peut faire en C ++ est limitée par leur complexité.

en D cependant ... avant la CTFE (évaluation de la fonction de compilation) existait, nous avons dû utiliser des modèles pour traitement de chaîne . C'est aussi la raison pour laquelle les grands symboles mutiles sont compressés dans DMD - les chaînes utilisées comme arguments de modèle font partie des noms de symboles mutilés, et lors de l'instanciation des modèles avec des segments plus longs de code (par exemple), les tailles de symboles résultantes explosent spectaculairement le format d'objet. .

C'est mieux aujourd'hui. Mais dans l'ensemble, des modèles causent toujours beaucoup de Blaite pour une raison simple - ils analysent plus rapidement et sont plus puissants que dans C ++, les gens les utilisent naturellement beaucoup plus (même dans les cas qui ne seraient techniquement pas besoin < / em> modèles). Je dois admettre que je suis l'un des délinquants principaux ici (jetez un coup d'œil à Outils.base Si vous le souhaitez, mais assurez-vous de garder un sac de barf à portée de main - le fichier est effectivement 90% de code de modèle).


0 commentaires

1
votes

Modèle d'instantion BLOAT est une question de pratique, car elle peut augmenter (beaucoup !!!) compiler et lier du temps.

I Personnaly pense que le problème C ++ n ° 1 est la compilation, et c'est principalement due à un modèle.

J'ai travaillé sur un projet avec environ 50 Libs. Nous avons eu notre propre système RTTI à l'aide de modèles. Je devais réécrire à cause du gallon de gallet

Voici quelques chiffres:

  • Libs est passé de 640 Mo à 420 Mo
  • Temps est passé de 4,3 Go à 2,9 Go
  • La reconstruction complète est passée de 19h30 à 13h10

1 commentaires

Cela ressemble à un "projet de jeu";) La plupart des jeux PC subissent ce problème, et souvent les développeurs repartissent le problème dans les modèles. Mais en réalité, le problème n'est que de General Code Bluoat et de jeter de plus en plus de plus en plus de libs. Le code de code généré par le code de modèle est généralement le bouc émissaire.