Domanda

boost :: tuple documentazione , l'accesso un singolo elemento di una tupla ha le stesse prestazioni, accesso a un membro variabile. Ad esempio, data la seguente dichiarazione:

tuple<A, B, C> t1(A(), B(), C());
struct T { A a; B b; C c; }
T t2;

Queste due affermazioni dovrebbero avere pari (o con differenza trascurabile) prestazioni:

t1.get<2>();
t2.c;

I esaminato le fonti di boost :: tuple e, se li ho capito bene (io non sono sicuro di aver fatto), la funzione get<N> esegue in realtà questa azione:

C get<2>(tuple<A, B, C>& t)
{
    return t.tail.tail.head;
    //Generally:  return t.tail. <<N times>> .head;
}

Questo è più simile ad un look-up in una lista concatenata di un accesso diretto, e, per quanto mi undestand, ha O (N) complessità, invece di O (1), che ci si aspetta da un accesso utente. Dalle mie esperienze passate con boost, mi piacerebbe pensare ho preso a torto; ma quello che è il mio errore? Come funziona get davvero lavoro?

È stato utile?

Soluzione

Si sono corrette sull'elenco-come prestazioni. Tuttavia, può essere risolto al momento della compilazione e quindi si riduce a O (1) in fase di esecuzione. (Data una sufficientemente buona compilatore ottimizzato.)

Altri suggerimenti

Ricordate, in C ++, l'operatore punto non è una deferenza puntatore, si tratta di un calcolo di offset diretta. La risposta generale è sì, i1.i2.i3.in per ogni n è una costante operazione calcolabile di tempo in fase di compilazione.

Se si vuole imparare un po 'la struttura interna del compilatore per questo senza scavare molto profondo, sguardo a LLVM getelementptr http://llvm.org/docs/LangRef.html#i_getelementptr Questo è esattamente come un compilatore C ++ come CLANG LLVM dovrebbero essere destinati durante la compilazione di un riferimento struct.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top