Pourquoi la norme C ++ n'a-t-elle pas adopté de modèles d'expression?

17

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::stringet streams?

DeadMG
la source
@ChrisLively: Si je soumettais une proposition suggérant un tel changement, alors ce serait absolument un problème que je ne savais pas pourquoi cela n'a pas été fait la première fois, et c'est absolument pertinent pour la programmation et la réponse est très spécifique.
DeadMG
Que feriez-vous exactement avec les modèles d'expression pour accélérer les chaînes?
2012
5
@jalf: Si vous deviez l'appliquer à operator+, vous pourriez réaliser O(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.
DeadMG
Je me rends compte que cette question a été posée il y a un certain temps, mais veuillez en préciser quelques-uns concernant les modèles d'expression et / ou les liens vers des documents pertinents.
einpoklum

Réponses:

17

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.

sbi
la source
1
Mais std::stringet iostreams n'étaient pas dans la STL.
R. Martinho Fernandes
@ R.MartinhoFernandes: Cela ne signifie pas, cependant, que le comité avait des ressources à revendre. (Et a std::string été changé pour le transformer en conteneur STL, BTW.)
sbi
2
Je pense que je dois simplement lier ceci: std :: string fait-il partie de la STL?
Xeo
@sbi ah, c'est logique.
R. Martinho Fernandes
10

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

Dietmar Kühl
la source
8
Vous commencez un peu injuste, car DeadMG ne pouvait pas faire pression en raison du simple fait qu'il avait à peine dépassé ses couches à l'époque et n'avait probablement pas atteint le point où il pouvait prononcer correctement "C ++". :)
sbi
7
Terriblement désolé qu'en tant que tout-petit, je n'ai pas fait de lobbying: P
DeadMG
1
Je me rends compte que tout le monde n'a pas eu l'occasion d'influencer la norme. Bien que j'assiste régulièrement aux réunions des comités depuis environ 15 ans, mon influence sur la norme est limitée. Cependant, mon point est: si quelqu'un veut quelque chose dans la norme, il doit faire des efforts! Les choses qui n'existent pas sont essentiellement attribuables à des personnes ayant d'autres priorités, qu'elles soient techniques ou autres (par exemple, se concentrer pleinement sur la croissance).
Dietmar Kühl
L'implémentation libgcc de valarray se base sur des modèles d'expression.
phresnel
3

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 .

Daveed V.
la source
1
me demande quel est l'intérêt d'utiliser un raccourcisseur de liens au lieu de la véritable URL
gnat
3
@gnat: Si vous connaissez un numéro de document, il est trivial d'écrire l'URL wg21.link pour celui-ci. C'est ce que j'ai fait ici. Cela m'évite de rechercher le mailing / l'année dans lequel un document a été publié. En outre, j'espère que si / quand WG21 décide de déplacer les URL d'hébergement, wg21.link sera mis à jour en conséquence, évitant ainsi les références périmées. (C'est-à-dire qu'il ne s'agit pas de raccourcir, mais de lisibilité.)
Daveed V.
0

Ma meilleure supposition est qu'aucun compilateur n'aurait été capable de compiler des modèles d'expression en 1998.

fredoverflow
la source
1
Todd Veldhuizen a fait son travail de modèle d'expression avant 1996 en utilisant le compilateur C ++ de KAI. La raison est beaucoup plus profane ...
1
Un grand pourcentage de la communauté C ++ n'a pas pu utiliser la STL à son plein potentiel jusqu'en 2003 non plus (je vous regarde, Microsoft!), Et cela n'a pas empêché le comité d'incorporer la STL dans la norme.
sbi
2
En fait, bth Todd et moi avons à l'origine obtenu la technique des modèles d'expression pour travailler sur le compilateur Borland C ++ 4 (qui a été publié en 1993). Soit dit en passant, je pense que c'est aussi le premier compilateur sur lequel la STL a été conçue pour fonctionner pleinement. Plus tard, j'ai porté une bibliothèque de modèles d'expression vers une variété d'autres compilateurs (y compris le compilateur basé sur Cfront de Sun à l'époque!). La compilation du compilateur KAI C ++ un peu plus tard.
Daveed V.
@DaveedV. BCC4 était un très bon compilateur pour l'époque et bien meilleur que la version VC de l'époque! Il avait cependant quelques bizarreries, comme le tristement célèbre "smiley bug". :->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.
sbi