2014-12-12 14 views
11

Chcę undesrtand, co jest przechowywane w stos/sterty w szybkim. Mam oszacowanie rought: Wszystko, co drukujesz i adres pamięci pojawia się nie wartości, są przechowywane w stosie, a co drukowane jako wartości, te są na stercie, w zasadzie według wartości i typów odniesienia. Czy całkowicie się mylę? Opcjonalnie, czy mógłbyś przedstawić wizualną replikację stosu/sterty?Swift stos/heap zrozumienie

+0

Ta prezentacja wyjaśnia niektóre zastosowania Swift w stosie i stosie: https://realm.io/news/andy-matuschak-controlling-complexity/. Krótko mówiąc, nie można założyć, że wartość lub referencja znajdzie się na stercie lub stosie, jak można w C. –

+0

Zaskoczony, że nikt jeszcze nie odpowiedział, czy jest to jakiś tajny język znany tylko po tobie zapłacić coś za jabłko? – Ahmed

Odpowiedz

7

Klasy (typy referencyjne) są przydzielane w stercie, typy wartości (takie jak Struct, String, Int, Bool itd.) Znajdują się w stosie. Zobacz ten temat bardziej szczegółowych odpowiedzi: Why Choose Struct Over Class?

13

jak Juul podano typy referencyjne są przechowywane w sterty i wartości w stos ...

Tutaj chcę dać wyjaśnienie dlaczego ...

stosu i sterty?

Stos jest używany do alokacji pamięci statycznej i Sterty do dynamicznego przydzielania pamięci, zarówno przechowywanych w pamięci RAM komputera.

Zmienne przydzielone na stosie są zapisywane bezpośrednio w pamięci, a dostęp do tej pamięci jest bardzo szybki, a jej przydział jest rozwiązywany podczas kompilacji programu. Kiedy funkcja lub metoda wywołuje inną funkcję, która z kolei wywołuje inną funkcję itp., Wykonywanie wszystkich tych funkcji pozostaje zawieszone do momentu, aż ostatnia funkcja zwróci swoją wartość. Stos jest zawsze zarezerwowany w poleceniu LIFO, ostatnio zarezerwowanym blokiem jest zawsze następny blok do uwolnienia. To sprawia, że ​​śledzenie stosu jest naprawdę proste, a zwolnienie bloku ze stosu to nic innego jak dostosowanie jednego wskaźnika.

enter image description here

Zmienne przydzielone na stercie mają ich pamięć przydzielona w czasie wykonywania i dostępu do tej pamięci jest nieco wolniejszy, ale wielkość sterty jest ograniczona jedynie wielkością pamięci wirtualnej. Element sterty nie ma wzajemnych zależności i zawsze można uzyskać do niego dostęp w dowolnej chwili. Możesz przydzielić blok w dowolnym momencie i zwolnić go w dowolnym momencie. To sprawia, że ​​o wiele bardziej skomplikowane jest śledzenie, które części sterty są przydzielane lub darmowe w danym momencie.