0Pricing
Swift Academy · Lekcja

Stos a sterta: gdzie przechowywane są wartości

Sposób przechowywania struktur na stosie i klas na stercie oraz wpływ tego rozwiązania na wydajność.

Stos a sterta: gdzie przechowywane są wartości to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.

Wprowadzenie

Zrozumienie, gdzie wartości Swift są przechowywane w pamięci — na stosie czy na stercie — jest niezbędne do pisania wydajnego i przewidywalnego kodu.

Stos

Stos to ciągły obszar pamięci zarządzany automatycznie: • Lokalne zmienne funkcji i parametry są przechowywane na stosie • Alokacja ma złożoność O(1) — wystarczy przesunąć wskaźnik • Pamięć jest automatycznie zwalniana po wyjściu z zakresu • Stos jest lokalny dla wątku — każdy wątek ma własny stos

Sterta

Sterta to współdzielona pula pamięci przeznaczona dla alokacji o długim czasie życia: • Obiekty są przechowywane na stercie, gdy ich czas życia wykracza poza jeden zakres • Alokacja wymaga znalezienia wolnej pamięci, więc jest bardziej kosztowna • W przypadku klas stertą zarządza ARC • Sterta jest współdzielona między wątkami, więc wymaga synchronizacji

Struktury są przechowywane na stosie

```swift func compute() { var pt = CGPoint(x: 3, y: 4) // on the stack pt.x += 1 } // pt freed automatically ``` Małe struktury są przekazywane przez kopiowanie — bez dodatkowego narzutu sterty.

Klasy są przechowywane na stercie

```swift class Dog { var name: String init(name: String) { self.name = name } } var d = Dog(name: "Rex") // Dog instance on heap // 'd' is a pointer on the stack ```

Duże struktury mogą korzystać ze sterty

Duże struktury (tablice, ciągi znaków i duże typy wartości) wewnętrznie używają COW i pamięci sterty, mimo że zachowują się jak typy wartości: ```swift var arr = [Int](repeating: 0, count: 10_000) // The array's buffer is on the heap; 'arr' itself is a stack value ```

Przechwytywanie w domknięciach

Gdy domknięcie przechwytuje zmienną typu wartości, która musi żyć dłużej niż dany zakres, Swift umieszcza ją w obiekcie na stercie: ```swift var count = 0 let increment = { count += 1 } // count captured in a heap box increment() print(count) // 1 ```

Opakowywanie typów egzystencjalnych protokołów

Przechowywanie małych typów wartości w zmiennych `any Protocol` może powodować alokację na stercie (opakowywanie egzystencjalne): ```swift var shape: any Shape = Circle(radius: 5) // may allocate on heap ``` Małe typy (≤3 words) są przechowywane bezpośrednio; większe typy są opakowywane.

Pomiar alokacji

Szablon Instruments Allocations pozwala sprawdzać alokacje na stercie: 1. Profile > Allocations 2. Filtrowanie według klasy lub kategorii 3. Śledzenie liczby wywołań `alloc` i `dealloc` Duża liczba alokacji w pętlach często wskazuje na nieoczekiwane opakowywanie.

Konsekwencje projektowe

• Należy preferować struktury dla krótkotrwałych typów przechowujących dane — szybkość stosu • Klas należy używać, gdy potrzebna jest tożsamość lub współdzielony stan • Należy unikać alokowania pamięci w ciasnych pętlach — warto wcześniej zarezerwować pamięć za pomocą `reserveCapacity` • Przed optymalizacją należy wykonać profilowanie — przedwczesna optymalizacja jest stratą czasu

Szybkie sprawdzenie

Który rodzaj pamięci jest automatycznie zwalniany po wyjściu z zakresu funkcji?

Podsumowanie

Najważniejsze informacje: • Stos: tani, automatyczny, lokalny dla wątku, przechowuje typy wartości • Sterta: elastyczna, zarządzana przez ARC, przechowuje typy referencyjne • Duże struktury używają wewnętrznych buforów na stercie (COW) • Domknięcia przechwytujące zmienne umieszczają je w obiektach na stercie • Instruments Allocations pozwala wykrywać nieoczekiwane obciążenie sterty Dalej: mutowanie, współdzielenie i nieoczekiwany aliasing.

Często zadawane pytania

Czy lekcja „Stos a sterta: gdzie przechowywane są wartości” jest bezpłatna?

Tak — pełny tekst „Stos a sterta: gdzie przechowywane są wartości” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Stos a sterta: gdzie przechowywane są wartości”?

Sposób przechowywania struktur na stosie i klas na stercie oraz wpływ tego rozwiązania na wydajność. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Swift Academy?

Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Stos a sterta: gdzie przechowywane są wartości”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?

Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Stos a sterta: gdzie przechowywane są wartości
  2. Mutowanie, współdzielenie i nieoczekiwane aliasowanie
  3. Mieszane grafy wartości i odwołań
  4. Projektowanie API z semantyką wartości
← Powrót do Swift Academy