2011-08-12 21 views
9

W doc doładowania make_shared, to mówi:Co oznacza „jeden przydział” oznacza dla boost :: make_shared

Oprócz wygody i stylu, taka funkcja jest również bezpieczny wyjątek i znacznie szybciej, ponieważ może użyj pojedynczego przydziału dla obiektu i jego odpowiedniego bloku kontrolnego, eliminując znaczną część narzutu związanego z budową shared_ptr.

Nie rozumiem znaczenia "pojedynczej alokacji", co to znaczy?

Odpowiedz

12

"Przydział" oznacza blok pamięci uzyskany z połączenia z alokatorem.

Zazwyczaj tworzenie shared_ptr z konstruktorem wskaźnika przydziela pamięć dla "bloku kontrolnego", który przechowuje licznik referencji i deleter. Kopie tego numeru shared_ptr odnoszą się do tego samego bloku kontrolnego, więc dzielą się licznikiem odnośników. W związku z tym są w sumie dwie alokacje - sam obiekt i blok kontrolny utworzony przez shared_ptr.

Jeśli utworzysz obiekt i shared_ptr wraz z make_shared, zostanie wykonana tylko jedna alokacja. Można myśleć o tym jako jeden z dwóch członków struct:

  1. obiektu, który jest zarządzany
  2. Blok sterowania.
+0

Ograniczenie elastyczności polega na tym, że nie można wybrać alokatora dla 'make_shared': To zawsze' std :: allocator'. A tak przy okazji, w jaki sposób zarządzają, że 'T *' wciąż jest zawsze na szczycie struktury danych? –

4

Urządzenie shared_ptr musi alokować miejsce na licznik odwołań. Oznacza to, że będziesz dynamicznie tworzyć swój obiekt (jedna alokacja) i przekazać go do shared_ptr, który z kolei przydzieli liczbę (drugi przydział). make_shared wykonuje pojedynczą alokację o wystarczająco dużym rozmiarze, a następnie tworzy zarówno liczbę, jak i obiekt.