Sobes.tech
Junior

Kaip naudojami stekas ir heap atmintyje?

sobes.tech AI

Atsakymas iš AI

Stack naudojamas vietinių kintamųjų, funkcijų parametrų ir grąžinimo adresų saugojimui. Atmintis automatiškai paskiriama ir atlaisvinama pagal LIFO (Last-In, First-Out) principą.

Heap naudojamas dinamiškam atminties paskyrimui objektams, kurių dydis nežinomas kompiliacijos metu arba kurių gyvavimo laikas viršija sukūrimo sritį. Atminties valdymas heap'e vykdomas rankiniu būdu arba naudojant atminties valdymo mechanizmus (Swift ARC, kitose kalbose šiukšlių surinkėjas).

Žymuo Stack Heap
Paskirstymas Automatinis Dinamiškas (rankiniu būdu arba naudojant MRC/ARC)
Atlaisvinimas Automatinis, kai išeinama iš matomumo srities Rankiniu būdu (free) arba naudojant MRC/ARC
Duomenų dydis Žinomas kompiliacijos metu Gali būti nežinomas iki vykdymo
Prieiga Greita, sekli Lėtesnė, atsitiktinė
Struktūra LIFO Objektų grafas
Pavyzdžiai Vietiniai kintamieji, funkcijų parametrai Klasės objektai, kintamo dydžio struktūros
// Swift pavyzdys, kaip naudoti stack ir heap

func myFunction() {
    // Vietinis kintamasis stack'e
    var stackVariable: Int = 10

    // Klasės objektas heap'e
    let heapObject = MyClass()

    // Vertės tipas stack'e (išskyrus struktūras, kurios turi nuorodinius tipus)
    var stackStruct = MyStruct()

    // Struktūra, turinti nuorodų tipą, gali būti heap'e
    var mixedStruct = MyMixedStruct()
}

class MyClass {
    // Objekto savybės saugomos heap'e
    var property: String = "Hello"
}

struct MyStruct {
    // Vertės tipo savybės saugomos stack'e
    var property: Int = 20
}

class MyReferenceType {
    var value: Int = 30
}

struct MyMixedStruct {
    // Vertės tipas stack'e
    var stackProperty: Int = 40
    // Nuorodinis tipas heap'e (sava nuoroda stack'e)
    var heapReference: MyReferenceType = MyReferenceType()
}