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