Je crois comprendre que les modèles d'expression en tant que technique ont été découverts de manière significative avant la norme C ++ originale en 1998. Pourquoi n'ont-ils pas été utilisés pour améliorer les performances de plusieurs classes standard comme std::string
et streams?
17
operator+
, vous pourriez réaliserO(n)
et zéro allocations redondantes pour les allocations répétées, ce qui est encore plus rapide que les références rvalue. De plus, vous pouvez par exemple optimiser les implémentations de COW en copiant en écriture , et pas seulement "sur l'index en non-const". Il existe également d'autres applications où les performances et la sémantique peuvent être améliorées avec des modèles d'expression.Réponses:
Les modèles d'expression ont été publiés pour la première fois par Todd Veldhuizen en juin 1995 , dans un article du magazine C ++ Report . À ce moment-là, le comité de normalisation était déjà fortement impliqué dans l'ajout de la STL à la norme C ++, une tâche qui à elle seule retardait la norme d'un ou deux ans. (La STL a été présentée au comité en 1993 et officiellement proposée en 1994. Il a fallu encore quatre ans pour terminer la norme.)
Étant donné que le comité de normalisation C ++ est un groupe de bénévoles, certains d'entre eux n'étant même pas soutenus par des entreprises qui paient leur dépenses, je ne pense pas que quiconque avait des ressources à utiliser pour ajouter encore une autre idée à la norme C ++.
De plus, 1995 n'est que l'année où l'article de Veldhuizen a été publié. Pour que la technique soit connue et reconnue , il aurait fallu encore quelques années . (L'idée de la STL remonte aux années 70, une implémentation Ada a été réalisée à la fin des années 80, le travail sur une implémentation C ++ doit avoir commencé vers 1990, et il a fallu encore trois ans pour que l'idée trouve son chemin vers la normalisation C ++ comité.)
Il étaient cependant, trois ans de l'article de Todd jusqu'à ce que le vote final sur la norme. C'était beaucoup trop peu de temps pour intégrer une idée qui était encore toute neuve et fondamentalement non testée.
Ajoutez à cela le fait que les modèles d'expression , étant une sorte de méta-programmation de modèle, stressent les compilateurs bien plus que le STL comparativement "simple". Et d'après ce dont je me souviens, même en 1998, lorsque la norme a été publiée, nous n'avions pas de compilateur qui pouvait même compiler la totalité de la STL.
Étant donné que l'un des principaux objectifs du comité de normalisation était de normaliser les pratiques établies (et non de s'y conformer rigoureusement), les modèles d'expression n'auraient jamais dû être à l'ordre du jour à l'époque.
la source
std::string
et iostreams n'étaient pas dans la STL.std::string
été changé pour le transformer en conteneur STL, BTW.)La réponse est simple: vous n'avez évidemment pas fait pression pour cela. Je ne l'ai pas fait non plus parce que j'avais (et j'ai) mon propre agenda qui ne comprend pas de modèles d'expression. De plus, l'interface en particulier pour les cordes essaie déjà de servir beaucoup trop de maîtres, ce qui donne une classe qui est utilisée pour tout et bonne pour le silence.
La bibliothèque standard a déjà une
std::valarray
famille qui est destinée à prendre en charge un style d'implémentation de modèle d'expression. Pour autant que je sache, cela ne suffit pas. Un problème qui a provoqué cela est que les personnes qui ont fait pression pour que sa version à moitié cuite soit incluse dans la norme cessent de fonctionner au moment où elle l'a incluse. Il y a eu des tentatives de sauvetage (par exemple, David Vandevoorde, Matt Austern, et j'ai travaillé dessus pendant un jour ou deux lors de la réunion de Stockholm) mais au final personne ne s'est suffisamment intéressé.la source
:)
La technique maintenant connue sous le nom de «modèles d'expression» a été découverte (indépendamment) au moins dès 1994 par Todd Veldhuizen et moi-même (l'article de Todd date de 1995, mais il faut un peu de temps pour que les choses soient publiées; mon propre travail a été montré pour la première fois dans comp.lang.c ++).
En fait, j'ai commencé à assister aux réunions du comité C ++ exactement à cause de ce problème. J'ai présenté la technique et une refonte complète de std :: valarray au comité lors de la première réunion de Santa Cruz en mars 1996. Il a été jugé trop important d'un changement, mais comme Dietmar y fait allusion, nous avons eu quelques mots à la réunion suivante à Stockholm qui permettent l'utilisation de modèles d'expression pour l'implémentation de std :: valarrray. À ma grande surprise, ces mots sont toujours là: voir le paragraphe 3-6 de la sous-section [valarray.syn] 29.7.1 dans http://wg21.link/N4727 .
la source
Ma meilleure supposition est qu'aucun compilateur n'aurait été capable de compiler des modèles d'expression en 1998.
la source
:->
De plus, ils n'ont pas réussi à l'améliorer assez rapidement, il est donc devenu de plus en plus difficile d'utiliser les techniques de modèles qui s'améliorent rapidement avec. Lorsque VC7.1 a été libéré et était beaucoup plus conforme, cela a tué Borland.