2013-04-24 17 views
7

Widziałem oba używane w tym samym celu, ale zastanawiam się, jak wynik byłby inny (jeśli w ogóle) i dlaczego jest w ogóle używany.Jaka jest różnica między krotką a kompresją?

Odniesienia do dokumentów: compressed_pair i tuple.

+2

std :: pair to krotka z dwóch elementów. Krotki mogą być dowolną liczbą elementów (dowolnego typu). Wyobrażam sobie, że dokumenty na temat compressed_pair mogą wyjaśnić cokolwiek innego. (Ale zakładam, że powoduje to kilka optymalizacji związanych z pamięcią masową) – GRAYgoose124

+0

@ GRAYgoose124: Tylko ta pierwsza, optymalna podstawa optymalizacji_. –

+0

Cóż, czy krotka nie zapewni wymaganej "kompresji", nawet dla dwóch elementów? – rubenvb

Odpowiedz

14

C++ wymaga, aby wszystkie typy miały rozmiar większy niż 0. Jeśli typ mógł mieć rozmiar 0, indeksowanie tablicy i inna matematyka wskazywałaby na błędy.

class EmptyClass { }; 

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

compressed_pair krotka jest z dwóch elementów, które są zoptymalizowane nie wymagają dodatkowej przestrzeni dla jednego tylko typu, o powierzchni 1, ponieważ wielkość 0 jest zabronione.

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

Uzyskano to poprzez Empty Base Optimization. Oba typy są umieszczane w opakowaniu klasy, a jeśli jeden typ jest "pusty", klasa staje się rodzicem drugiej.

+0

Dlaczego przyjmujesz rozmiar klasy 'compressed_pair'. Czy nie zwraca typu, przez który można uzyskać dostęp za pomocą ':: [name_of_type]'? ... – 0x499602D2

+0

@ 0x499602D2 (chyba że jestem zdezorientowany) ilustruje to, że obecność 'EmptyClass' nie zwiększa rozmiaru' compressed_pair' jako całość. –

+0

W jaki sposób rozmiar 'compressed_pair' może mieć taki sam rozmiar jak' int', który zasadniczo próbuję powiedzieć. – 0x499602D2

Powiązane problemy