Junior
Ինչպես է հիշողության մեջ օգտագործվում ստեկը և heap-ը։
sobes.tech AI
Պատասխան AI-ից
Stack-ը օգտագործվում է տեղական փոփոխականների, ֆունկցիայի պարամետրերի և վերադարձի հասցեների պահպանման համար: Հիշողությունը ավտոմատ կերպով հատկացվում և ազատվում է, ըստ LIFO (Last-In, First-Out) սկզբունքի:
Heap-ը օգտագործվում է դինամիկ հիշողության հատկացման համար օբյեկտների համար, որոնց չափը անհայտ է կոմպիլյացիայի ժամանակ կամ որոնց կյանքի տևողությունը գերազանցում է ստեղծման տարածքը: Հիշողության կառավարումը heap-ում կատարվում է ձեռքով կամ հիշողության կառավարման մեխանիզմների (ARC in Swift, garbage collector in other languages) միջոցով:
| Գծանշում | Stack | Heap |
|---|---|---|
| Հատկացում | Ավտոմատ | Դինամիկ (ձեռնարկով կամ MRC/ARC-ի միջոցով) |
| Ազատում | Ավտոմատ՝ տեսանելիության տարածքից դուրս գալուց հետո | Ձեռնարկով (free) կամ MRC/ARC-ի միջոցով |
| Տվյալների չափը | Կատարման ժամանակ հայտնի | Մինչև կատարման անհայտ կարող է լինել |
| Մուտքագրում | Արագ, հաջորդական | Ավելի դանդաղ, պատահական |
| Կառուցվածք | LIFO | Օբյեկտների գրաֆիկը |
| Օրինակներ | Տեղական փոփոխականներ, ֆունկցիայի պարամետրեր | Կլասի օբյեկտներ, փոփոխական չափի կառուցվածքներ |
// Swift-ում stack և heap օգտագործման օրինակ
func myFunction() {
// Տեղական փոփոխական stack-ում
var stackVariable: Int = 10
// Կլասի օբյեկտ heap-ում
let heapObject = MyClass()
// Տվյալ տեսակ stack-ում (բացառությամբ կառուցվածքների, որոնք պարունակում են հղումային տեսակներ)
var stackStruct = MyStruct()
// Կառուցվածք, որը պարունակում է հղումային տեսակ, մասամբ կարող է լինել heap-ում
var mixedStruct = MyMixedStruct()
}
class MyClass {
// Օբյեկտի հատկությունները պահվում են heap-ում
var property: String = "Hello"
}
struct MyStruct {
// Տվյալ տեսակների հատկությունները պահվում են stack-ում
var property: Int = 20
}
class MyReferenceType {
var value: Int = 30
}
struct MyMixedStruct {
// Տվյալ արժեքային տեսակ stack-ում
var stackProperty: Int = 40
// Հղումային տեսակ heap-ում (ինքնին հղումը stack-ում)
var heapReference: MyReferenceType = MyReferenceType()
}