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
Odpowiedz
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).
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? –
@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
odpowiedź jest tutaj: http://stackoverflow.com/a/13460653/2183287 –