2013-04-24 15 views
7

Ho visto entrambi utilizzati per lo stesso scopo, ma mi chiedo come il risultato sarebbe diverso (se non del tutto) e perché questo è usato del tutto.Qual è la differenza tra una tupla e una compressa_pair?

Riferimenti a documenti: compressed_pair e tuple.

+2

std :: pair è una tupla di due elementi. Le tuple possono essere un numero qualsiasi di elementi (di qualsiasi tipo). Immagino che i documenti su compressed_pair possano spiegare qualsiasi altra cosa. (Ma suppongo che faccia diverse ottimizzazioni rilevanti per lo storage) – GRAYgoose124

+0

@ GRAYgoose124: Solo uno, l'ottimizzazione base _empty. –

+0

Bene, una tupla non fornisce già la "compressione" necessaria, anche per due elementi? – rubenvb

risposta

14

C++ richiede che tutti i tipi abbiano una dimensione maggiore di 0. Se un tipo potrebbe avere una dimensione pari a 0, l'indicizzazione di matrice e altri simboli matematici del puntatore andrebbero in errore.

class EmptyClass { }; 

std::cout << sizeof(EmptyClass); // Prints "1" (typically) 

Un compressed_pair è una tupla di due elementi, ottimizzata non richiedere spazio aggiuntivo per un tipo che ha solo una dimensione di 1 perché una dimensione di 0 è vietato.

if (sizeof(compressed_pair<int,EmptyClass>) == sizeof(int)) 
{ 
    std::cout << "EmptyClass was compressed."; // (This will print) 
} 

Questo è ottenuto tramite Empty Base Optimization. Entrambi i tipi vengono inseriti in un wrapper di classe e se un tipo è "vuoto", quella classe diventa l'elemento principale dell'altro.

+0

Perché stai prendendo le dimensioni della classe 'compressed_pair'. Non restituisce un tipo tramite il quale è possibile accedere con ':: [nome_del_tipo]?? ... – 0x499602D2

+0

@ 0x499602D2 (A meno che non sia confuso) illustra che la presenza di' EmptyClass' non aggiunge alla dimensione del ' compressed_pair' nel suo complesso. –

+0

Come potrebbe la dimensione di 'compressed_pair' avere la stessa dimensione di' int' che sto fondamentalmente cercando di dire. – 0x499602D2

Problemi correlati