Sobes.tech
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()
}