Sobes.tech
Junior

Jak se ve paměti používají zásobník a halda?

sobes.tech AI

Odpověď od AI

Zásobník (stack) se používá pro ukládání místních proměnných, parametrů funkcí a adres návratu. Paměť je automaticky přidělována a uvolňována podle principu LIFO (Last-In, First-Out).

Heap (halda) se používá pro dynamické přidělování paměti pro objekty, jejichž velikost je během kompilace neznámá nebo jejichž životnost přesahuje rozsah, ve kterém jsou vytvořeny. Správa paměti na haldě je prováděna ručně nebo pomocí mechanismů správy paměti (ARC ve Swiftu, garbage collector v jiných jazycích).

Vlastnost Zásobník (stack) Halda (heap)
Přiřazení Automatické Dynamické (ručně nebo s MRC/ARC)
Uvolnění Automaticky při opuštění rozsahu Ručně (free) nebo s MRC/ARC
Velikost dat Známá při kompilaci Může být neznámá do doby běhu
Přístup Rychlý, sekvenční Pomalejší, náhodný
Struktura LIFO Graf objektů
Příklady Lokální proměnné, parametry funkcí Objektové třídy, struktury s proměnnou velikostí
// Příklad použití zásobníku a haldy ve Swiftu

func myFunction() {
    // Lokální proměnná na zásobníku
    var stackVariable: Int = 10

    // Objekt třídy na haldě
    let heapObject = MyClass()

    // Typ hodnoty na zásobníku (kromě struktur obsahujících referenční typy)
    var stackStruct = MyStruct()

    // Struktura obsahující referenční typ, část může být na haldě
    var mixedStruct = MyMixedStruct()
}

class MyClass {
    // Vlastnosti objektu jsou uloženy na haldě
    var property: String = "Hello"
}

struct MyStruct {
    // Vlastnosti typu hodnoty jsou uloženy na zásobníku
    var property: Int = 20
}

class MyReferenceType {
    var value: Int = 30
}

struct MyMixedStruct {
    // Typ hodnoty na zásobníku
    var stackProperty: Int = 40
    // Referenční typ na haldě (samotná reference na zásobníku)
    var heapReference: MyReferenceType = MyReferenceType()
}