2013-04-24 17 views
7

Ich habe gesehen, beide für den gleichen Zweck verwendet, aber ich frage mich, wie das Ergebnis würde (wenn überhaupt) und warum dies überhaupt verwendet wird.Was ist der Unterschied zwischen einem Tupel und einem compressed_pair?

Verweise auf Dokumente: compressed_pair und tuple.

+2

std :: pair ist ein Tupel aus zwei Elementen. Tupel können beliebig viele Elemente (beliebiger Art) enthalten. Ich könnte mir vorstellen, dass die Dokumente von compressed_pair alles andere erklären können. (Aber ich nehme an, es macht mehrere speicherrelevante Optimierungen) – GRAYgoose124

+0

@ GREYgoose124: Nur die eine, die _leere Basisoptimierung_. –

+0

Nun, würde ein Tupel nicht schon die nötige "Kompression" liefern, auch für zwei Elemente? – rubenvb

Antwort

14

C++ erfordert, dass alle Typen eine Größe größer als 0 haben. Wenn ein Typ könnte eine Größe von 0 haben, Array-Indizierung und andere Zeiger Mathe würde schief gehen.

class EmptyClass { }; 

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

compressed_pair A ist ein Tupel aus zwei Elementen, die nicht erfordern zusätzlichen Speicherplatz für einen Typen optimiert ist, die nur eine Größe von 1 hat, weil eine Größe von 0 ist verboten.

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

Dies wird durch Empty Base Optimization erreicht. Beide Typen werden in einen Klassenwrapper eingefügt, und wenn ein Typ "leer" ist, wird diese Klasse das übergeordnete Element des anderen.

+0

Warum nehmen Sie die Größe der 'compressed_pair' Klasse. Gibt es keinen Typ zurück, über den man mit ':: [Name_des_Typs]'? ... – 0x499602D2

+0

@ 0x499602D2 (es sei denn, ich bin verwirrt) darauf verweisen kann, dass das Vorhandensein von 'EmptyClass' nicht zur Größe des' 'beiträgt compressed_pair' als Ganzes. –

+0

Wie könnte die Größe von 'compressed_pair' die gleiche Größe wie' int' haben? Ich versuche im Grunde zu sagen. – 0x499602D2

Verwandte Themen