Perché lo standard C ++ non ha adottato modelli di espressione?


17

Comprendo che i modelli di espressione come tecnica sono stati scoperti in modo significativo prima dello standard C ++ originale nel 1998. Perché non sono stati usati per migliorare le prestazioni di diverse classi standard std::stringe flussi?


@ChrisLively: Se dovessi presentare una proposta che suggerisca un tale cambiamento, sarebbe assolutamente un problema non sapere perché non è stato fatto la prima volta, ed è assolutamente rilevante per la programmazione e la risposta è molto specifico.
DeadMG

Cosa faresti esattamente con i modelli di espressione per velocizzare le stringhe?
jalf

5
@jalf: se dovessi applicarlo operator+, potresti ottenere O(n)e zero allocazioni ridondanti per allocazioni ripetute, qualcosa che è ancora più veloce dei riferimenti di valore. Inoltre, è possibile ottimizzare ad esempio le implementazioni COW copiando in scrittura , non solo "su indice in non const". Esistono anche altre applicazioni in cui sia le prestazioni che la semantica possono essere migliorate con i modelli di espressione.
DeadMG

Mi rendo conto che questa domanda è stata posta qualche tempo fa, ma per favore elabora alcuni riguardo a quali modelli di espressione sono e / o link al materiale pertinente.
einpoklum,

Risposte:


17

I modelli di espressioni sono stati pubblicati per la prima volta da Todd Veldhuizen nel giugno 1995 , in un articolo sulla rivista C ++ Report . A quel punto, il comitato standard era già fortemente coinvolto nell'aggiunta dell'STL allo standard C ++, un compito che da solo ritardava lo standard di uno o due anni. (L'STL è stato presentato al comitato nel 1993 e proposto ufficialmente nel 1994. Ci sono voluti altri quattro anni per completare lo standard.)
Dato che il comitato di standardizzazione C ++ è composto da un gruppo di volontari, alcuni dei quali non sono nemmeno supportati da aziende che pagano il loro spese, non credo che qualcuno avesse alcuna risorsa da utilizzare per aggiungere un'altra idea allo standard C ++.

Inoltre, il 1995 è solo l'anno in cui l'articolo di Veldhuizen è stato pubblicato. Perché la tecnica fosse conosciuta e riconosciuta , ci sarebbero voluti altri anni . (L'idea della STL risale agli anni '70, un'implementazione di Ada è stata fatta alla fine degli anni '80, i lavori per un'implementazione in C ++ devono essere iniziati intorno al 1990 e ci sono voluti altri tre anni per trovare la strada verso la standardizzazione C ++ commissione.)
Tuttavia, ci sono stati solo tre anni dall'articolo di Todd fino al voto finale sullo standard. Era troppo poco tempo per incorporare un'idea che era ancora nuova di zecca e sostanzialmente non testata.

Aggiungete a ciò il fatto che Expression Templates , essendo una sorta di meta-programmazione di template, rende i compilatori di stress molto più della STL relativamente "semplice". E da quello che ricordo, anche nel 1998, quando è stato pubblicato lo standard, non avevamo un compilatore in grado di compilare l'intero STL.
Dato che uno dei principali obiettivi del comitato di standardizzazione era standardizzare le prassi consolidate (non che si attenessero rigorosamente a questo), i modelli di espressioni non avrebbero mai dovuto essere all'ordine del giorno in quel momento.


1
Ma gli std::stringiostreams non erano nella STL.
R. Martinho Fernandes,

@ R.MartinhoFernandes: Ciò non significa, tuttavia, che il comitato avesse delle risorse da risparmiare. (Ed è std::string stato cambiato per trasformarlo in un contenitore STL, BTW.)
sbi

2
Penso di dover solo collegare questo: std :: string fa parte di STL?
Xeo,

@sbi ah, ha senso.
R. Martinho Fernandes,

10

La risposta è semplice: si , ovviamente, non ha lobby per esso. Né l'ho fatto perché avevo (e ho) la mia agenda che non include modelli di espressione. Inoltre, l'interfaccia in particolare per le stringhe sta già cercando di servire troppi master, risultando in una classe che viene utilizzata per tutto e buona per il lutto.

La libreria standard ha già una std::valarrayfamiglia che intende supportare uno stile di implementazione del modello di espressione. Per quanto ne so, però, non è del tutto tagliato. Un problema che ha causato questo è che le persone che hanno fatto pressioni per ottenere la versione semi-cotta inclusa nello standard hanno smesso di lavorarci nel momento in cui includevano. Ci furono tentativi di salvarlo (ad es. David Vandevoorde, Matt Austern e io ci lavorammo per circa un giorno all'incontro di Stoccolma) ma alla fine nessuno era abbastanza interessato.


8
Inizi un po 'ingiusto, perché DeadMG non ha potuto fare pressioni per questo a causa del semplice fatto che allora aveva appena superato i suoi pannolini e probabilmente non aveva raggiunto il punto in cui poteva pronunciare correttamente "C ++". :)
sabato

7
Mi dispiace terribilmente che da bambino non ho fatto pressioni: P
DeadMG

1
Mi rendo conto che non tutti hanno avuto l'opportunità di influenzare lo standard. Sebbene partecipi regolarmente alle riunioni dei comitati da circa 15 anni, la mia influenza sullo standard è limitata. Tuttavia, il mio punto è: se qualcuno vuole qualcosa nello standard, deve fare uno sforzo! Le cose che non ci sono dipendono essenzialmente dalle persone che hanno altre priorità, siano esse tecniche o meno (ad esempio, concentrandosi completamente sulla crescita).
Dietmar Kühl,

L'implementazione libgcc di valarray si basa su modelli di espressioni.
galleria

3

La tecnica ora conosciuta come "modelli di espressione" è stata scoperta (in modo indipendente) almeno nel 1994 sia da Todd Veldhuizen che da me stesso (l'articolo di Todd è del 1995, ma ci vuole un po 'di tempo prima che le cose vengano pubblicate; il mio lavoro è stato mostrato per la prima volta in comp.lang.c ++).

In realtà ho iniziato a partecipare alle riunioni del comitato C ++ proprio per questo problema. Ho presentato la tecnica e una completa riprogettazione di std :: valarray alla commissione alla prima riunione di Santa Cruz nel marzo 1996. È stato ritenuto un cambiamento troppo grande, ma come allude Dietmar, abbiamo avuto alcune parole al successivo incontro a Stoccolma che consentono l'uso di modelli di espressioni per l'implementazione di std :: valarrray. Con mia sorpresa, quelle parole sono ancora lì: vedi il paragrafo 3-6 della sottosezione [valarray.syn] 29.7.1 in http://wg21.link/N4727 .


1
mi chiedo qual è il punto di usare un accorciatore di collegamenti invece del vero URL
gnat

3
@gnat: se conosci un numero di documento, è banale scrivere l'URL wg21.link per questo. Questo è quello che ho fatto qui. Mi risparmia la ricerca del particolare mailing / anno in cui è stato rilasciato un documento. Inoltre, spero che se / quando WG21 decide di spostare gli URL di hosting, wg21.link verrà aggiornato di conseguenza, evitando così riferimenti non aggiornati. (Vale a dire, il punto non è accorciamento, ma leggibilità.)
Daveed V.

0

La mia ipotesi migliore è che nessun compilatore sarebbe stato in grado di compilare modelli di espressioni nel 1998.


1
Todd Veldhuizen ha fatto funzionare il suo modello di espressione prima del 1996 usando il compilatore C ++ di KAI. Il motivo è molto più profano ...

1
Una grande percentuale della comunità C ++ non è stata in grado di utilizzare il STL al massimo delle sue potenzialità fino al 2003 (ti sto guardando, Microsoft!), E ciò non ha impedito al comitato di integrare lo STL nello standard.
sabato

2
In realtà, io e Todd abbiamo originariamente ottenuto la tecnica dei modelli di espressione per lavorare sul compilatore C ++ 4 di Borland (che è stato rilasciato nel 1993). Per inciso, credo che sia anche il primo compilatore su cui l'STL è stato realizzato per funzionare completamente. Successivamente ho portato una libreria di modelli di espressioni su una varietà di altri compilatori (incluso il compilatore basato su Sunfront a quel tempo!). La camma del compilatore C ++ di KAI un po 'più tardi.
Daveed V.

@DaveedV. BCC4 era un ottimo compilatore per il suo tempo e molto meglio della versione VC di quel tempo! Aveva alcune stranezze, tuttavia, come il famigerato "insetto di smiley". :->Inoltre non sono riusciti a migliorarlo abbastanza velocemente, quindi è diventato sempre più difficile utilizzare le tecniche di template in rapido miglioramento con esso. Quando VC7.1 è stato rilasciato ed è stato molto più conforme, questo ha ucciso Borland.
sbi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.