Stack vs Heap: poznaj różnicę

Spisie treści:

Anonim

Co to jest stos?

Stos to specjalny obszar w pamięci komputera, który przechowuje tymczasowe zmienne utworzone przez funkcję. W stosie zmienne są deklarowane, przechowywane i inicjowane w czasie wykonywania.

Jest to pamięć tymczasowa. Po zakończeniu zadania obliczeniowego pamięć zmiennej zostanie automatycznie usunięta. Sekcja stosu zawiera głównie metody, zmienne lokalne i zmienne referencyjne.

W tym samouczku dowiesz się,

  • Co to jest stos?
  • Co to jest Heap?
  • Kluczowe różnice między stosem a stertą
  • Zalety korzystania ze stosu
  • Zalety korzystania z Heap
  • Wady korzystania ze stosu
  • Wady korzystania z Heap
  • Kiedy używać sterty lub stosu?

Co to jest Heap?

Sterta to pamięć używana przez języki programowania do przechowywania zmiennych globalnych. Domyślnie wszystkie zmienne globalne są przechowywane w pamięci sterty. Obsługuje dynamiczną alokację pamięci.

Sterta nie jest zarządzana automatycznie i nie jest tak ściśle zarządzana przez procesor. Bardziej przypomina swobodny obszar pamięci.

KLUCZOWA RÓŻNICA

  • Stos jest liniową strukturą danych, podczas gdy Sterta jest hierarchiczną strukturą danych.
  • Pamięć stosu nigdy nie zostanie pofragmentowana, podczas gdy pamięć sterty może zostać pofragmentowana, gdy bloki pamięci są najpierw przydzielane, a następnie zwalniane.
  • Stack uzyskuje dostęp do zmiennych lokalnych tylko, podczas gdy Heap umożliwia dostęp do zmiennych globalnie.
  • Nie można zmieniać rozmiaru zmiennych stosu, natomiast można zmieniać rozmiar zmiennych stosu.
  • Pamięć stosu jest przydzielana w ciągłym bloku, podczas gdy pamięć sterty jest przydzielana w dowolnej kolejności.
  • Stos nie wymaga usuwania alokacji zmiennych, podczas gdy w Heap jest to konieczne.
  • Przydzielanie i cofanie alokacji stosu odbywa się za pomocą instrukcji kompilatora, podczas gdy alokacja i cofanie alokacji stosu są wykonywane przez programistę.

Kluczowe różnice między stosem a stertą

Parametr Stos Sterta
Typ struktur danych Stos to liniowa struktura danych. Sterta to hierarchiczna struktura danych.
Szybkość dostępu Szybki dostęp Wolniej w porównaniu ze stosem
Zarządzanie przestrzenią Przestrzeń zarządzana efektywnie przez system operacyjny, dzięki czemu pamięć nigdy nie zostanie podzielona. Przestrzeń sterty nie jest używana tak wydajnie. Pamięć może zostać pofragmentowana, gdy bloki pamięci zostaną najpierw przydzielone, a następnie zwolnione.
Dostęp Tylko zmienne lokalne Umożliwia globalny dostęp do zmiennych.
Limit wielkości miejsca Limit rozmiaru stosu w zależności od systemu operacyjnego. Nie ma określonego limitu rozmiaru pamięci.
Zmień rozmiar Nie można zmieniać rozmiaru zmiennych Rozmiar zmiennych można zmieniać.
Alokacja pamięci Pamięć jest przydzielana w ciągłym bloku. Pamięć jest przydzielana w dowolnej kolejności.
Alokacja i cofanie przydziału Wykonywane automatycznie przez instrukcje kompilatora. Jest to wykonywane ręcznie przez programistę.
Dealokacja Nie wymaga usuwania przydziałów zmiennych. Konieczne jest wyraźne cofnięcie alokacji.
Koszt Mniej Jeszcze
Realizacja Stos można zaimplementować na 3 sposoby w oparciu o prostą tablicę, używając pamięci dynamicznej i opartej na liście połączonej. Stertę można zaimplementować za pomocą tablicy i drzew.
Główna kwestia Brak pamięci Fragmentacja pamięci
Lokalność odniesienia Automatyczne instrukcje kompilacji. Odpowiedni
Elastyczność Stały rozmiar Zmiana rozmiaru jest możliwa
Czas dostępu Szybciej Wolniej

Zalety korzystania ze stosu

Oto zalety / zalety korzystania ze stosu:

  • Pomaga w zarządzaniu danymi w metodzie Last In First Out (LIFO), co nie jest możliwe w przypadku połączonych list i tablic.
  • Gdy funkcja jest wywoływana, zmienne lokalne są przechowywane na stosie i po zwróceniu są automatycznie niszczone.
  • Stos jest używany, gdy zmienna nie jest używana poza tą funkcją.
  • Pozwala kontrolować sposób przydzielania i zwalniania pamięci.
  • Stos automatycznie czyści obiekt.
  • Niełatwo ulegać uszkodzeniu
  • Nie można zmieniać rozmiaru zmiennych.

Zalety korzystania z Heap

Zalety / zalety korzystania z pamięci sterty to:

  • Sterta pomaga znaleźć największą i minimalną liczbę
  • Wyrzucanie elementów bezużytecznych działa w pamięci sterty, aby zwolnić pamięć używaną przez obiekt.
  • Metoda sterty używana również w kolejce priorytetowej.
  • Umożliwia globalny dostęp do zmiennych.
  • Sterta nie ma żadnego limitu rozmiaru pamięci.

Wady korzystania ze stosu

Wady / wady korzystania z pamięci stosu to:

  • Pamięć stosu jest bardzo ograniczona.
  • Tworzenie zbyt wielu obiektów na stosie może zwiększyć ryzyko przepełnienia stosu.
  • Losowy dostęp nie jest możliwy.
  • Pamięć zmienna zostanie nadpisana, co czasami prowadzi do nieokreślonego zachowania funkcji lub programu.
  • Stos wypadnie poza obszar pamięci, co może doprowadzić do nieprawidłowego zakończenia.

Wady korzystania z Heap

Wady / wady korzystania z pamięci Heaps to:

  • Może zapewnić maksymalną ilość pamięci, jaką może zapewnić system operacyjny
  • Obliczenie zajmuje więcej czasu.
  • Zarządzanie pamięcią jest bardziej skomplikowane w przypadku pamięci sterty, ponieważ jest ona używana globalnie.
  • Wykonywanie tego zabiera zbyt dużo czasu w porównaniu ze stosem.

Kiedy używać sterty lub stosu?

Należy używać sterty, gdy trzeba przydzielić duży blok pamięci. Na przykład, jeśli chcesz utworzyć tablicę o dużym rozmiarze lub dużą strukturę, aby utrzymać tę zmienną przez długi czas, powinieneś alokować ją na stercie.

Jeśli jednak pracujesz ze stosunkowo małymi zmiennymi, które są wymagane tylko do czasu, gdy funkcja ich używa. Następnie musisz użyć stosu, co jest szybsze i łatwiejsze.