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.
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
@ GREYgoose124: Nur die eine, die _leere Basisoptimierung_. –
Nun, würde ein Tupel nicht schon die nötige "Kompression" liefern, auch für zwei Elemente? – rubenvb