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.
fonte
2013-04-24 18:24:10
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
@ GRAYgoose124: Solo uno, l'ottimizzazione base _empty. –
Bene, una tupla non fornisce già la "compressione" necessaria, anche per due elementi? – rubenvb