2012-11-19 10 views
30

Jeśli rozmiar pustej klasy nie może wynosić 0, jaka magia robi std :: tuple, więc sizeof unique_ptr zwróci 8 na 64-bitowym komputerze?W jaki sposób std :: unique_ptr nie ma narzutów rozmiaru?

W unique_ptr człon definiuje się jako:

typedef std::tuple<typename _Pointer::type, _Dp> __tuple_type;     
    __tuple_type _M_t; 

przypadku _DP jest klasa deleter.

kompilator gcc w wersji 4.7.1 (Debian 4.7.1-7)

+2

Może to być również zależne od implementacji, więc możesz chcieć dołączyć do tego kompilatora, o którym mówisz. –

+5

Nie jestem pewien, jak 'std :: tuple' odnosi się do' std :: unique_ptr' w twoim pytaniu. Czy mógłbyś wyjaśnić? – Cameron

+2

@Cameron, _M_t jest typem bazowym na unique_ptr. – piotr

Odpowiedz

43

Powodem jest to, że typename _Dp = default_delete<_Tp> jest pustą klasą, a szablon tuple stosuje pustą optymalizację klasy bazowej.

Jeśli utworzysz instancję unique_ptr z innym niż domyślnym usunięciem, powinieneś zobaczyć wzrost rozmiaru.

+10

Aby trochę sformułować: gdy jest tworzona automatycznie, klasa musi mieć niezerowy rozmiar, ale gdy jest instatiowana jako klasa podstawowa, dozwolony jest zerowy rozmiar. –

+0

Powiązane: http://www.stroustrup.com/bs_faq2.html#sizeof-empty –

28

unique_ptr określony może mieć zerową narzut, ponieważ jedyną rzeczą, potrzebne do wdrożenia to jest modyfikacja procesu kopiowania/przenoszenia surowego wskaźnik ; żadne dodatkowe informacje nie są konieczne. Dlatego też unique_ptr nie musi przechowywać niczego poza wskaźnikiem i może mieć taki sam rozmiar jak wskaźnik.

Co do tego, w jaki sposób twoja konkretna implementacja to zapewnia; Tylko większość typów pochodnych musi mieć rozmiar większy od zera. Puste klasy bazowe mogą zajmować zero bajtów. Często zdarza się, że standardowe implementacje bibliotek korzystają z tak zwanej optymalizacji "pustej klasy podstawowej" dla wszystkich rodzajów rzeczy, od bezstanowych alokatorów w kontenerach do krotek.

+0

Dzięki za odpowiedź, głosowałem +1 Akceptowałem chłód, ponieważ ma on mniej punktów, a także dostarczył poprawną odpowiedź. – piotr

Powiązane problemy