Co to jest sterta pamięci?

174

Co to jest sterta pamięci?

H4cKL0rD
źródło

Odpowiedzi:

234

Przypuszczalnie masz na myśli stertę z punktu widzenia alokacji pamięci, a nie z punktu widzenia struktury danych (termin ma wiele znaczeń).

Bardzo prostym wyjaśnieniem jest to, że sterta to część pamięci, w której znajduje się pamięć przydzielana dynamicznie (tj. Pamięć przydzielana przez malloc). Pamięć przydzielona ze sterty pozostanie przydzielona do momentu wystąpienia jednej z następujących sytuacji:

  1. Pamięć jest freed
  2. Program kończy się

Jeśli wszystkie odwołania do przydzielonej pamięci zostaną utracone (np. Nie przechowujesz już do niej wskaźnika), masz tak zwany wyciek pamięci . To jest miejsce, w którym pamięć jest nadal przydzielona, ​​ale nie masz już łatwego dostępu do niej. Wyciek pamięci nie może zostać odzyskany do przyszłych alokacji pamięci, ale gdy program zakończy działanie, pamięć zostanie zwolniona przez system operacyjny.

Porównaj to z pamięcią stosu, w której żyją zmienne lokalne (zdefiniowane w ramach metody). Pamięć przydzielona na stosie przeważnie żyje tylko do momentu powrotu funkcji (są pewne wyjątki, np. Statyczne zmienne lokalne).

Więcej informacji o stercie można znaleźć w tym artykule .

LeopardSkinPillBoxHat
źródło
3
W jaki sposób zmienne lokalne mogą żyć w stosie? Stos pozwala na pobranie tylko jednej zmiennej na raz w bardzo określonej kolejności. A jeśli potrzebuję zmiennej lokalnej z jakiegoś niższego miejsca na stosie?
CodyBugstein
9
@Imray - w języku z typami statycznymi rozmiary parametrów lokalnych są znane w czasie kompilacji. Dlatego zmienne lokalne mogą być po prostu dostępne bezpośrednio ze stosu poprzez przesunięcie adresu. W tym celu nie ma potrzeby rozkładania stosu. Zobacz tę odpowiedź, aby uzyskać więcej informacji.
LeopardSkinPillBoxHat
17

Sterta pamięci to lokalizacja w pamięci, w której pamięć może być przydzielana w trybie swobodnego dostępu.
W przeciwieństwie do stosu, w którym pamięć jest przydzielana i zwalniana w ściśle określonej kolejności, poszczególne elementy danych alokowane na stercie są zwykle zwalniane w sposób asynchroniczny względem siebie. Każdy taki element danych jest zwalniany, gdy program jawnie zwalnia odpowiedni wskaźnik, co może spowodować pofragmentowanie sterty. W przeciwieństwie do tego, tylko dane na górze (lub na dole, w zależności od sposobu działania stosu) mogą zostać zwolnione, co spowoduje uwolnienie elementu danych w kolejności odwrotnej do przydzielenia.

mjv
źródło
9

Sterta to po prostu obszar, w którym pamięć jest przydzielana lub zwalniana bez żadnego zamówienia. Dzieje się tak, gdy tworzy się obiekt za pomocą newoperatora lub czegoś podobnego. W przeciwieństwie do stosu, w którym pamięć jest zwalniana na podstawie pierwszego w, ostatniego.

fastcodejava
źródło
8

Sterta pamięci to wspólna struktura do przechowywania dynamicznie przydzielanej pamięci. Zobacz Dynamic_memory_allocation na Wikipedii.

Istnieją inne struktury, takie jak baseny, stosy i stosy.

Justicle
źródło
7

Jest to porcja pamięci przydzielona z systemu operacyjnego przez menedżera pamięci używanego przez proces. Wywołania do malloc()et alia następnie pobierają pamięć z tego stosu, zamiast zajmować się bezpośrednio systemem operacyjnym.

Ignacio Vazquez-Abrams
źródło
7

Prawdopodobnie masz na myśli pamięć sterty, a nie stertę pamięci.

Pamięć sterty to w zasadzie duża pula pamięci (zazwyczaj na proces), z której uruchomiony program może żądać porcji. Nazywa się to zwykle alokacją dynamiczną .

Różni się od stosu, w którym przydzielane są „zmienne automatyczne”. Na przykład, kiedy definiujesz w funkcji C zmienną wskaźnikową, na stosie przydzielana jest wystarczająca ilość miejsca do przechowywania adresu pamięci. Jednak często będziesz musiał dynamicznie przydzielić miejsce (za pomocą malloc) na stercie, a następnie podać adres, od którego zaczyna się ta porcja pamięci, do wskaźnika.

Uri
źródło