Sobes.tech
Middle

Ի՞նչ կլինի զանգվածի ընդհանուր հիշողությունը՝ կախված այն տարրերի քանակից և տեսակից, որոնք ավելացվել են դրան:

sobes.tech AI

Պատասխան AI-ից

Ընդհանուր հիշողությունը, որը զբաղեցնում է զանգը, մոտավորապես բաղկացած է.

  1. Զանգի ընդհանուր ծախսերը: Swift-ի ներքին կառուցվածքները զանգի կառավարման համար (օրինակ, հղման հաշվիչ, ծավալի և չափի մասին տեղեկություններ): Այս ծախսերը ֆիքսված են կամ կախված են ծավալից:

  2. Զանգի տարրերի կողմից զբաղեցված հիշողությունը: կախված է տարրերի թվից և յուրաքանչյուր տարրի տիպից:

    • Արժեքային տիպեր (Value Types): օրինակ, Int, Double, Struct: յուրաքանչյուր օրինակ պահում է իր տվյալները անմիջապես զանգի ներսում: Տիպի չափը հավասար է հիշողության չափին:

      // Int32-ի չափը 4 բայթ է 64-բիթային ճարտարապետության վրա
      let intSize = MemoryLayout<Int32>.size // 4
      
    • Հղման տիպեր (Reference Types): օրինակ, Class, String (երկար տողերի համար), փակագծեր: Զանգը պահում է միայն օբյեկտների հղումները: Տվյալների չափը հավասար է հղման չափին (համաձայն 8 բայթ 64-բիթային ճարտարապետության վրա): Օբյեկտները պահվում են heap-ում, և նրանց չափը անմիջապես չի ազդում զանգի ներսում հիշողության վրա:

      // Հղման չափը (օրինակ, դասի օրինակ)
      let referenceSize = MemoryLayout<AnyObject>.size // 8 64-բիթային ճարտարապետության վրա
      

Ամենայն հավանականությամբ, հետևյալ բանաձևն է՝

Ընդհանուր հիշողություն ≈ Զանգի ծախսեր + (Զանգի տարրերի թիվ * Տարրի չափը)

Տարրի չափը արժեքային տիպերի համար՝ MemoryLayout<ElementType>.size, իսկ հղման տիպերի համար՝ MemoryLayout<AnyObject>.size:

Նույնպես, կարևոր է զանգի ծավալը ընդլայնելու մեխանիզմը. երբ զանգը հասնում է իր ներկայիս ծավալին, Swift-ը սովորաբար հատկացնում է նոր, ավելի մեծ հիշողության բլոկ (օրինակ, երկու անգամ մեծ), և կպցնում է այնտեղ առկա տարրերը: Սա ժամանակավոր ավելացում է հիշողության սպառման մեջ ընդլայնման ժամանակ և կարող է առաջացնել անօգտագործվող հիշողություն (capacity - count).