2012-07-25 15 views
5

Zastanawiam się,Struct z typami odniesienia i GC?

Instancja klasy jest na kupie. (typy wartości wewnątrz niego są również w stercie).

Ale co z z obudową?

Istnieje jedno pytanie: here, ale nie wspomniano o żadnych związanych z nim informacjach o GC.

Tak - w jaki sposób GC radzi sobie z taką sytuacją?

public struct Point 
{ 
object o ; 

    public int x, y; 

    public Point(int p1, int p2) 
    { 
    o = new Object(); 
     x = p1; 
     y = p2;  
    } 
} 

Odpowiedz

7

zawiera odniesienie do obiektu na stercie. Zostanie to zakwalifikowane do pobrania, gdy tylko nie będzie więcej kopii tego Point z tym odniesieniem. Zauważyć, że:

Point p1 = new Point(1,2); 
Point p2 = p1; 

wynosi 2 kopie każdego z odniesieniem do samego obiektu na sterty. Jeśli punkty te są przechowywane jako pola na obiekcie, to oczywiście czas życia obiektu będzie co najmniej tak długi, jak obiekt z tymi polami. Jeśli te punkty są tylko zmiennymi na stosie, staje się bardziej skomplikowana, ponieważ GC może wziąć pod uwagę, czy zmienna jest zawsze ponownie czytać. Jeśli tak nie jest, zmienna może nie istnieć skutecznie (lub: może).

Ścieżka może być bardzo pośrednia, ale zasadniczo sprowadza się do: czy GC może dostać się do obiektu, zaczynając od korzeni GC.

+0

marc I ** Nie ** chce zapytać, co jeśli ta struktura sama jest członkiem pola klasy instancji .... :) :) –

+0

@RoyiNamir Po prostu wszyscy oni będą mieszkać na kupie; -) –

+0

@RoyiNamir the GC zadadzą to pytanie chociaż –

3

GC robi szukania korzeni obiektów w

  • GC Handles (zmienne statyczne są korzenie, które są GC Uchwyty również)
  • Wszystko Temat stosy
  • CPU Rejestruje

W twój przypadek to struktura zwykle umieszczona wewnątrz stosu wątków i dlatego wyszukiwana. Jeśli jest w pudełku, znajduje się na zarządzanej stercie jako pseudo obiekt. Ale możesz być pewny, że to jest poprawnie policzone przez GC. Ponieważ zawiera obiekt, nie jest już typem blittable i nie może zostać przekazany do niezarządzanego kodu za pośrednictwem PInvoke.

Istnieje problem z PInvokes, jeśli przekazujesz do niego struct, że będzie GCed, nawet jeśli trwa nieodebrane połączenie, które powoduje, że dostajesz tylko kompilacje wydań, ponieważ dla kompilacji debugujących okres istnienia zmiennych jest przedłużany do metoda została. W trybie zwolnienia GC zbiera o wiele bardziej agresywnie.

Edytuj1: Struktury jako członków w obiektach klasy nie są przypadkami specjalnymi. GC sprawdza również wszystkie pola klas dla odwołań klas w osadzonych strukturach.

+0

Jest więcej http://stackoverflow.com/questions/9938186/gc-roots-misunderstanding –

0

Miejsce przechowywania typu struct może być najlepiej postrzegane jako zbiór miejsc przechowywania przymocowanych wraz z taśmą samoprzylepną marki Duck ®; naturą połączonych ze sobą miejsc przechowywania będzie struktura. Jeśli struktura jest przechowywana na stosie, jej pola będą przechowywane na stosie; jeśli struktura jest przechowywana w polu obiektu sterty, jej pola będą przechowywane jako część tego obiektu sterty; itp.Jeśli struktura jest przechowywana w zmiennym miejscu przechowywania, jej pola (publiczne lub prywatne) będą podlegać zmianom (nawet jeśli struktura nie przewiduje mutacji, skopiowanie jednej struktury do drugiej zmodyfikuje ją poprzez nadpisanie jej pól odpowiednimi polami były). Jeśli struktura jest przechowywana w niezmiennym miejscu przechowywania, wszystkie jej pola będą niezmienne.

Jeśli będziesz oglądał rzeczy w ten sposób, łatwo będzie zrozumieć, że zachowanie GC w strukturze jest zasadniczo takie samo jak zachowanie GC, które można uzyskać, po prostu zastępując struct osobnymi polami (jedynym znaczącym miejscem zachowanie jest "niezwykłe" z tablicami, ponieważ zwykle w gnieździe tablicy znajduje się tylko jeden element, a nie zbiór pól, nie ma żadnego nie-strukturalnego odpowiednika tablicy typu struct).

Powiązane problemy