2013-04-23 16 views
12

Sono curioso di sapere quanto tempo richiede una chiamata a std::get<> su un std::tuple<>. Alcuni brevi googling (incluse le pagine di riferimento che di solito contengono queste informazioni) non hanno dato risultati.Efficienza di std :: get con std :: tupla

mia intuizione iniziale (e paura) è che la struttura ricorsiva di tupla (se viene implementato come un modello variadic) porterebbe ad ottenere che richiede un ordine di N lookup (Una chiamata a get<3>(t) cercando come t.rest().rest().first(). Sono sperando sono lontano qui ...

Poi di nuovo, mi auguro che il compilatore sarebbe in grado di ottimizzare questo per tornare direttamente l'offset senza il sovraccarico di N di chiamate corretta.

Fondamentalmente quello che voglio : esiste una garanzia specifica sul runtime? Ciò limita il modo in cui viene implementato std::tuple

risposta

14

Le specifiche C++ non forniscono una garanzia sulle prestazioni di runtime di alcuna funzione. Anche quando afferma requisiti asintotici, ciò garantisce solo il numero relativo di operazioni, non le prestazioni di quelle operazioni. O (1) non significa veloce, né O (n) significa lento.

Puoi fidarti del tuo compilatore/ottimizzatore/implementazione della libreria standard, oppure puoi riscriverlo tutto da solo per ottenere le prestazioni che desideri. std::get, nella maggior parte dei compilatori ragionevoli (con ottimizzazioni attivate), dovrebbe eseguire più o meno in modo equivalente per accedere direttamente al valore da una struttura. Ma le specifiche non lo richiedono in nessun momento.

+3

La sezione pertinente dello standard qui è ** 1.9 Esecuzione del programma [intro.execution] * * "1 Le descrizioni semantiche di questo standard internazionale definiscono una macchina astratta non parametrica parametrizzata: questo standard internazionale non impone alcun requisito sulla struttura delle implementazioni conformi, in particolare non è necessario copiare o emulare la struttura della macchina astratta. sono richiesti per emulare (solo) il comportamento osservabile della macchina astratta come spiegato below.5 " – TemplateRex

19

L'efficienza sarà paragonabile all'accesso a un membro di una struttura. Il get<> viene risolto in fase di compilazione.

+3

Potete indicarmi le specifiche? Potresti spiegarlo in dettaglio? Cosa abilita questo? inline? –

+0

Questo è abilitato dalla risoluzione del modello, eseguita durante la compilazione. In fase di esecuzione, il codice risolve la lettura dall'indirizzo dell'oggetto + uno spostamento (e quindi simile all'accesso a un membro di una 'struct'). – utnapistim

+0

@AnthonySottile È sempre possibile controllare l'assieme generato e vedere che è ciò che sta facendo. – Collin

3

La risposta alla prima domanda (per quanto tempo std::get accetta) dipende da come la libreria sceglie di implementare std::tuple e std::get. Ma in genere, le biblioteche sceglieranno di utilizzare un approccio non ricorsivo, simile a quello delineato qui: http://mitchnull.blogspot.com/2012/06/c11-tuple-implementation-details-part-1.html. Con questo tipo di approccio, il tempo di accesso di std::get sarà costante e approssimativamente equivalente al tempo necessario per accedere a un membro di una struttura.

In risposta a se lo standard fornisce garanzie: come altri hanno già detto, no, lo standard non fornisce alcuna garanzia in questo caso. Uno scrittore di librerie malvagio potrebbe scegliere di rendere esponenziale std::get in N, e sarebbero comunque conformi agli standard.

Problemi correlati