Stos
To stack
blok pamięci do przechowywania local variables
i parameters
. Stos logicznie rośnie i kurczy się w miarę wprowadzania i zamykania funkcji.
Rozważ następującą metodę:
public static int Factorial (int x)
{
if (x == 0)
{
return 1;
}
return x * Factorial (x - 1);
}
Ta metoda jest rekurencyjna, co oznacza, że wywołuje samą siebie. Za każdym razem, gdy metoda jest wprowadzana, na stosie przydzielana jest nowa wartość int , a za każdym razem, gdy metoda kończy działanie, przydział int jest zwalniany .
Sterta
- Sterta to blok pamięci, w którym
objects
(tj. reference-type instances
) Rezydują. Za każdym razem, gdy tworzony jest nowy obiekt, jest on alokowany na stercie i zwracane jest odwołanie do tego obiektu. Podczas wykonywania programu sterta zaczyna się zapełniać w miarę tworzenia nowych obiektów. Środowisko wykonawcze ma moduł odśmiecania pamięci, który okresowo zwalnia obiekty ze stosu, więc program nie działa Out Of Memory
. Obiekt kwalifikuje się do cofnięcia przydziału, gdy tylko nie odwołuje się do niego nic, co samo w sobiealive
.
- Sterta również przechowuje
static fields
. W przeciwieństwie do obiektów przeznaczonych na stercie (które można dostać śmieci zebrane) these live until the application domain is torn down
.
Rozważ następującą metodę:
using System;
using System.Text;
class Test
{
public static void Main()
{
StringBuilder ref1 = new StringBuilder ("object1");
Console.WriteLine (ref1);
StringBuilder ref2 = new StringBuilder ("object2");
StringBuilder ref3 = ref2;
Console.WriteLine (ref3);
}
}
W powyższym przykładzie zaczynamy od utworzenia obiektu StringBuilder, do którego odwołuje się zmienna ref1, a następnie wypisujemy jego zawartość. Ten obiekt StringBuilder jest następnie natychmiast kwalifikowany do wyrzucania elementów bezużytecznych, ponieważ nic go później nie używa. Następnie tworzymy kolejny obiekt StringBuilder, do którego odwołuje się zmienna ref2, i kopiujemy to odwołanie do ref3. Mimo że ref2 nie jest używany po tym punkcie, ref3 utrzymuje ten sam obiekt StringBuilder przy życiu - zapewniając, że nie kwalifikuje się on do kolekcji, dopóki nie skończymy używać ref3.
Instancje typu wartości (i odwołania do obiektów) znajdują się wszędzie tam, gdzie zadeklarowano zmienną. Jeśli instancja została zadeklarowana jako pole w ramach typu klasy lub jako element tablicy, to instancja ta znajduje się na stercie.