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
.
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
.
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.
Dlaczego przyjmujesz rozmiar klasy 'compressed_pair'. Czy nie zwraca typu, przez który można uzyskać dostęp za pomocą ':: [name_of_type]'? ... – 0x499602D2
@ 0x499602D2 (chyba że jestem zdezorientowany) ilustruje to, że obecność 'EmptyClass' nie zwiększa rozmiaru' compressed_pair' jako całość. –
W jaki sposób rozmiar 'compressed_pair' może mieć taki sam rozmiar jak' int', który zasadniczo próbuję powiedzieć. – 0x499602D2
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
@ GRAYgoose124: Tylko ta pierwsza, optymalna podstawa optymalizacji_. –
Cóż, czy krotka nie zapewni wymaganej "kompresji", nawet dla dwóch elementów? – rubenvb