Meines Erachtens wurden Ausdrucksvorlagen als eine Technik wesentlich vor dem ursprünglichen C ++ - Standard im Jahr 1998 entdeckt. Warum wurden sie nicht verwendet, um die Leistung mehrerer Standardklassen wie std::string
und Streams zu verbessern ?
17
operator+
, könnten SieO(n)
redundante Zuordnungen für wiederholte Zuordnungen erzielen und auf Null setzen, was immer noch schneller ist als rWert-Referenzen. Darüber hinaus können Sie beispielsweise COW-Implementierungen optimieren, indem Sie beim Schreiben kopieren und nicht nur "beim Indexieren in Nicht-Konstante". Es gibt auch andere Anwendungen, bei denen sowohl die Leistung als auch die Semantik mit Ausdrucksvorlagen verbessert werden können.Antworten:
Ausdrucksvorlagen wurden zum ersten Mal von Todd Veldhuizen im Juni 1995 in einem Artikel in der Zeitschrift C ++ Report veröffentlicht. Zu diesem Zeitpunkt war das Standardkomitee bereits stark mit der Erweiterung des C ++ - Standards um die STL befasst , eine Aufgabe, die den Standard von sich aus um ein oder zwei Jahre verzögerte. (Die STL wurde dem Komitee 1993 vorgelegt und 1994 offiziell vorgeschlagen. Die Fertigstellung des Standards dauerte weitere vier Jahre.)
Da es sich beim C ++ - Standardisierungskomitee um eine Gruppe von Freiwilligen handelt, von denen einige nicht einmal von Unternehmen unterstützt werden, die ihre Arbeit bezahlen Ich glaube, niemand hatte Ressourcen, um dem C ++ - Standard eine weitere Idee hinzuzufügen.
1995 ist auch nur das Jahr, in dem Veldhuizens Artikel veröffentlicht wurde. Es hätte noch einige Jahre gedauert, bis die Technik bekannt und anerkannt wurde . (Die Idee der STL stammt aus den 70er Jahren, eine Ada-Implementierung wurde Ende der 80er Jahre durchgeführt, die Arbeit an einer C ++ - Implementierung muss um 1990 begonnen haben, und es dauerte weitere drei Jahre, bis die Idee den Weg zur C ++ - Standardisierung fand Ausschuss.) Es waren jedoch nur drei Jahre von Todd Artikel bis zur endgültigen Abstimmung über den Standard. Das war viel zu wenig Zeit, um eine Idee umzusetzen, die noch brandneu und im Grunde ungetestet war.
Hinzu kommt, dass Expression Templates als eine Art Template- Metaprogrammierung den Compiler weit mehr belasten als die vergleichsweise "einfache" STL. Und soweit ich mich erinnere, hatten wir selbst 1998, als der Standard veröffentlicht wurde, keinen Compiler, der sogar die gesamte STL kompilieren konnte.
Angesichts dessen, dass eines der Hauptziele des Standardisierungskomitees darin bestand, die etablierte Praxis zu standardisieren (nicht, dass sie sich strikt daran hielt), hätten Ausdrucksvorlagen damals nie auf der Tagesordnung stehen dürfen.
quelle
std::string
und iostreams waren nicht in der STL.std::string
wurde geändert, um es in einen STL-Container zu verwandeln, Übrigens.)Die einfache Antwort lautet: Sie haben sich offensichtlich nicht dafür eingesetzt. Ich auch nicht, weil ich meine eigene Agenda hatte (und habe), die keine Ausdrucksvorlagen enthält. Auch die Schnittstelle, insbesondere für Strings, versucht bereits, viel zu viele Master zu bedienen, was zu einer Klasse führt, die für alles verwendet wird und gut zum Motten ist.
Die Standardbibliothek verfügt bereits über eine
std::valarray
Familie, die einen Ausdrucksvorlagen-Implementierungsstil unterstützen soll. Soweit ich das beurteilen kann, ist das allerdings nicht ganz klar. Ein Problem, das dies verursachte, war, dass die Leute, die sich für die Aufnahme der halbgebackenen Version in den Standard einsetzten, sofort aufhörten, daran zu arbeiten. Es gab Versuche, es zu retten (z. B. David Vandevoorde, Matt Austern und ich haben an dem Treffen in Stockholm etwa einen Tag lang gearbeitet), aber am Ende war niemand interessiert genug.quelle
:)
Die als "Ausdrucksvorlagen" bekannte Technik wurde (unabhängig) von Todd Veldhuizen und mir bereits 1994 entdeckt (Todd's Artikel ist aus dem Jahr 1995, aber es dauert ein wenig, bis etwas veröffentlicht wird, meine eigene Arbeit) wurde erstmals in comp.lang.c ++) gezeigt.
Genau aus diesem Grund habe ich angefangen, an C ++ - Ausschusssitzungen teilzunehmen. Ich habe dem Komitee beim ersten Treffen in Santa Cruz im März 1996 die Technik und eine komplette Neugestaltung von std :: valarray vorgestellt. Diese Änderung wurde als zu umfangreich angesehen, aber wie Dietmar anspielt, haben wir uns auf dem anschließenden Treffen ein wenig geäußert in Stockholm, die die Verwendung von Ausdrucksvorlagen für die Implementierung von std :: valarrray ermöglichen. Zu meiner Überraschung sind diese Wörter immer noch vorhanden: Siehe Absatz 3-6 von Unterabschnitt [valarray.syn] 29.7.1 in http://wg21.link/N4727 .
quelle
Ich vermute, dass kein Compiler im Jahr 1998 in der Lage gewesen wäre, Ausdrucksvorlagen zu kompilieren.
quelle
:->
Außerdem konnten sie es nicht schnell genug verbessern, sodass es immer schwieriger wurde, die sich schnell verbessernden Vorlagentechniken damit zu verwenden. Als VC7.1 veröffentlicht wurde und viel mehr den Anforderungen entsprach, tötete das Borland.