Czy enable_shared_from_this zapewnia taką samą optymalizację? A więc:
Nie. Jak widać na podstawie sformułowania w standardzie, enable_shared_from_this<T>
ma element danych weak_ptr<T>
. To dodaje weak_ptr<T>
do klasy, która ma wskaźnik do bloku kontrolnego, który zawiera liczniki odwołań. Nie zawiera bezpośrednio referencji. Blok kontrolny zawierający liczniki referencyjne nadal istnieje na zewnątrz obiektu.
Blok sterujący zawierający liczniki referencyjne musi przeżyć obiekt, aby inne obiekty weak_ptr
, które odnosiły się do obiektu, nadal mogły uzyskać dostęp do bloku sterującego, aby sprawdzić, czy wygasł.
Jeśli blok kontrolny znajdował się wewnątrz obiektu, zostanie zniszczony, gdy obiekt zostanie zniszczony, a nie będzie możliwe bezpieczne ustalenie, czy obiekt wygasł. Teoretycznie pamięć bloku kontrolnego mogłaby zostać przydzielona i nadal używana, a licznik odwołań został zaktualizowany, nawet jeśli obiekt, którego był częścią, został zniszczony, ale wydaje się to dość brzydkie (i oznaczałoby, że obiekt nie zostałby zniszczony przy pomocy delete
, wymagałoby jawnego wywołania destruktora i wyraźnego wywołania w celu zwolnienia pamięci).
Nie można również użyć wbudowanego bloku sterującego, jeśli własność shared_ptr
została utworzona za pomocą niestandardowego narzędzia lub niestandardowego programu przydzielania, ponieważ rozmiar tych obiektów nie byłby wcześniej znany. W takich przypadkach nadal trzeba by przydzielić zewnętrzny blok kontrolny oprócz, który jest osadzony w klasie bazowej, marnując jeszcze więcej miejsca.
Oba są całkowicie ortogonalne. 'enable_shared_from_this' jest istotne, gdy * masz już * wspólny wskaźnik. –
@KerrekSB Przypuszczam, że enable_shared_from_this dodaje niektóre dane do klasy, które mogą być używane przez implementację współdzielonego wskaźnika. Jeśli chodzi o mnie, najprostszy sposób - polega na umieszczeniu liczby odwołań w ramach opcji enable_shared_from_this, co może pomóc w zmniejszeniu alokacji pamięci w pierwszym przypadku. –
Kusi mnie, aby powiedzieć "tak", ponieważ w przeciwnym razie nie ma sposobu na odzyskanie bloku refcount z wnętrza obiektu. Ale to tylko przeczucie. – Quentin