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()
}