Sobes.tech
Junior

Kuidas kasutatakse mälu stäki ja heap'i?

sobes.tech AI

Vastus AI-lt

Virn kasutatakse kohalike muutujate, funktsiooniparameetrite ja tagasipöördumisadresi hoidmiseks. Mälu eraldatakse ja vabastatakse automaatselt LIFO (Last-In, First-Out) põhimõttel.

Hüpe (Heap) kasutatakse dünaamiliseks mälu eraldamiseks objektidele, mille suurus on teadmata kompileerimise ajal või mille eluea aeg ületab nende loomise piirkonna. Mälu haldamine hüppel toimub käsitsi või mäluhalduse mehhanismide (ARC Swiftis, prügikoristaja teistes keeltes) abil.

Tunnus Virn Hüpe
Eraldumine Automaatne Dünaamiline (käsitsi või MRC/ARC abil)
Vabastamine Automaatne, kui väljutakse nähtavuspiirkonnast Käsitsi (free) või MRC/ARC abil
Andmete suurus Teadaolev kompileerimise ajal Võib olla teadmata täitmise ajal
Juurdepääs Kiire, järjestikune Aeglasem, juhuslik
Struktuur LIFO Objektide graafik
Näited Kohaliku muutujad, funktsiooniparameetrid Klasside objektid, muudetava suurusega struktuurid
// Swift näide virna ja hüppe kasutamisest

func myFunction() {
    // Kohalik muutuja virnas
    var stackVariable: Int = 10

    // Klasside objekt hüppes
    let heapObject = MyClass()

    // Väärtusetüüp virnas (välja arvatud struktuurid, mis sisaldavad viidatüüpe)
    var stackStruct = MyStruct()

    // Struktuur, mis sisaldab viidatüüpi, võib olla hüppes
    var mixedStruct = MyMixedStruct()
}

class MyClass {
    // Objekti omadused salvestatakse hüppes
    var property: String = "Hello"
}

struct MyStruct {
    // Väärtusetüüpi omadused salvestatakse virnas
    var property: Int = 20
}

class MyReferenceType {
    var value: Int = 30
}

struct MyMixedStruct {
    // Väärtusetüüpi virnas
    var stackProperty: Int = 40
    // Viidatüüpi hüppes (ise viide virnas)
    var heapReference: MyReferenceType = MyReferenceType()
}