2015-11-07 33 views
8

Czy instancja unique_ptr (bez niestandardowego deletera) ma taki sam ślad pamięci, co surowy wskaźnik lub czy instancja przechowuje więcej niż tylko wskaźnik?Ślad pamięci unique_ptr

+2

Jest to bardzo specyficzne pytanie dotyczące implementacji i jako takie może się znacznie różnić między różnymi standardowymi bibliotekami. Ale dla prostego sprawdzenia dlaczego nie użyć 'sizeof' do sprawdzenia i porównania do surowego wskaźnika? –

+1

@JoachimPileborg Ponieważ myślałem, że inni ludzie mogą mieć to samo pytanie w przyszłości. Słuszna uwaga. Technicznie powinienem był zapytać: "Czy to * możliwe * zaimplementować' unique_ptr' z tym samym śladem pamięci, co surowy wskaźnik ", ponieważ implementacje prawdopodobnie wykonają to, jeśli to możliwe. – Museful

+0

odpowiedź jest tutaj: http://stackoverflow.com/a/13460653/2183287 –

Odpowiedz

7

Jak sugeruje @JoachimPileborg z GCC 4.8 (x64) kod

std::cout << "sizeof(unique_ptr) = " << sizeof(std::unique_ptr<int>) << '\n'; 

produkuje ten wyjściowe:

sizeof (unique_ptr) = 8

Tak, pod tym implementacja, odpowiedź brzmi: tak.

To nie jest zadziwiające: po wszystkim, unique_ptr nie dodaje możliwości do surowe wskaźniki (np licznik jak shared_ptr robi w rzeczywistości, jeśli mogę wydrukować sizeof(shared_ptr<int>) wynik tej chwili jest 16.). unique_ptr dba o niektóre aspekty zarządzania wskaźnikami.

Nawiasem mówiąc, będąc innym niż surowy, wygenerowany kod będzie różny w przypadku użycia jednego lub drugiego. W szczególności, jeśli kod unique_ptr wykracza poza zakres kodu, kompilator wygeneruje kod dla destruktora tej konkretnej specjalizacji i będzie on używać , który koduje za każdym razem, gdy zostanie zniszczony ten kod unique_ptr (i to jest dokładnie to, co chcesz).