2013-03-18 19 views
20

Jestem mylony z pojęciem "silny wskaźnik" i "słaby wskaźnik". Sama Diane Hackborn powiedziała:Co to są mocne wskaźniki i słabe wskaźniki

Obiekt pozostanie w pobliżu, gdy pojawią się silne wskaźniki; jest zniszczony po zwolnieniu ostatniego. Wszystko, co możesz zrobić ze słabym wskaźnikiem , to porównanie i próba promowania do silnego wskaźnika; ta ostatnia nie powiedzie się, jeśli nie ma innych mocnych wskaźników na obiekcie .

Co jest dość niejasne dla mnie. Czy silny wskaźnik jest odpowiednikiem wspólnego wskaźnika (boost::)? I jaka jest rola słabego wskaźnika, jeśli jest po prostu próba promowania się do silnego wskaźnika? Na przykład, kiedy potrzebujemy słabych i mocnych wskaźników?

Aktualizacja:

Dziękuję wszystkim, ale pytam konkretnie o androida jądra sp i wp, a oni nie mają nic wspólnego z odniesieniami Javy w ogóle.

Zasadniczo próbuję złamać kod tutaj http://www.androidenea.com/2010/03/share-memory-using-ashmem-and-binder-in.html I nie bardzo rozumiem użycie sp i wp

Aktualizacja:

Rzeczywista odpowiedź leży w komentarzach przyjętą odpowiedź. Dzięki Gabe Sechan:

Silne i słabe wskaźniki są różne implementacje inteligentne wskaźnik i zrobić więcej w tym samym thing- gdy wskaźnik znajdzie się poza zasięgiem, tak długo co najmniej jeden z tych dokumentów ma silne wskaźnik nie będzie być uwolnionym. Jeśli odniesienie tylko słabe wskaźniki (lub nic) to będzie. Czek jest wykonywany za każdym razem, gdy odwołuje się do niego silne lub słabe odniesienie.

jeśli mam 10 słabych wskaźników odnoszących się do tego samego obiektu i jeden z tych 10 wykracza poza zakres, obiekt zostanie zniszczony? Podczas gdy z mocnymi wskazówkami, tylko gdy wszystkie 10 z nich wykracza poza zakres, obiekt zostanie zniszczony?

Tak, prawie. Jeśli wszystko, co masz, to 10 słabych wskaźników, to prawdopodobnie wykroczył poza zakres, kiedy ostatni silny wskaźnik wyłączył się z zakresu . Wdrożenie może pozwolić mu na pozostanie trochę mniejszym, jeśli jest dłuższy, jeśli jest wolna pamięć, ale zostanie przerwane, jeśli przejdziesz na w stan niskiej ilości pamięci i to nie brzmi tak, jak ich implementacja jest zaawansowana od jej cytatu. A użycie tego jest nadal głównie buforowaniem - jest to mniej więcej odpowiednik boost sharedi zwiększenie weak_ptr. Zasadniczo, słaby wskaźnik może mieć obiekt, który odwołuje się w dowolnym momencie.

+0

+1 za wysiłek wyjaśnienia tej koncepcji. – miller

Odpowiedz

7

Android ma być programowany w Javie, a nie w dowolnej dokumentacji dokumentacji zespołu Android. W Javie są silne i słabe odniesienia.Słabe odniesienie nie powstrzymuje czyszczenia śmieci od odkurzacza, ma silne referencje. Są one używane do buforowania w niektórych systemach operacyjnych, ale w systemie Android od wersji 3.0 trzymanie tylko słabych odniesień do obiektu oznacza, że ​​zostaną one natychmiast zebrane.

C nie ma odpowiednika słabego odniesienia, ponieważ nie ma zbierania śmieci.

+4

Właściwie programuję jądro Androida, więc nie ma Java, dzięki. –

+5

Wtedy nie powinieneś być zainteresowany słabymi lub silnymi referencjami :-) – fedepaol

+0

@fedepaol pobił mnie do tego ... – Simon

22

sp oznacza StrongPointer w Androidzie pamięć zajętą ​​przez ostro zakończony obiekt zostanie zwolniona, jeśli licznik odniesienia będzie równy 0. wp oznacza WeakPointer, więc jeśli mam słaby wskaźnik, nie obchodzi mnie, czy obiekt, do którego się odwołuje, jest żywy, czy nie. Może być używany w niektórych scenariuszach pamięci podręcznej i porównawczych.

Najpierw spójrz na implementację sp w wersji StrongPointer.h.

Jest to po prostu opakowanie do liczenia odwołań. Na przykład,

template<typename T> template<typename U> 
sp<T>& sp<T>::operator = (U* other) 
{ 
    if (other) ((T*)other)->incStrong(this); 
    if (m_ptr) m_ptr->decStrong(this); 
    m_ptr = other; 
    return *this; 
} 

Jeśli stworzyć silną Pointer przez sp<IBinder> strongPointer The m_ptr jest przedmiotem odwołania. Jak widać w kodzie źródłowym, szablon sp reprezentuje tylko silny wskaźnik, więc system nie zwolni pamięci, dopóki utrzymam ten sp. Nie utrzymuje licznika referencyjnego. Licznik jest utrzymywany w klasie RefBase. A żeby użyć StrongPointer, twój obiekt musi być instancją RefBase.

Klasa RefBase utrzymuje zarówno silny licznik referencyjny, jak i słaby licznik referencyjny, jedyną różnicą jest to, że obiekt referencyjny zostanie zwolniony, jeśli silna policzy do 0. Ponadto, dla obiektu zarządzanego przez Refbase, może on być przywoływany przez niektóre Silne Wskaźniki i Słabe wskaźniki jednocześnie.

Widać szerokie zastosowania StrongPointers w systemie Android, większość z nich znajduje się na obiekcie IBinder, a natywny obiekt wiążący może przejść przez różne procesy. Różne procesy mogą zawierać silne wskaźniki dla tego samego obiektu, obiekt nie zostanie odwołany przez system, dopóki jeden proces nadal będzie trzymał wskaźnik.

+0

Dlaczego klasa 'sp' nie utrzymuje liczby referencyjnej tak, jak robi to' std :: shared_pointer'? Jaka jest zaleta dzielenia obowiązków w ten sposób? – Adrian

+0

To powinno być oznaczone jako odpowiedź ... –