Ի՞նչ կլինի զանգվածի ընդհանուր հիշողությունը՝ կախված այն տարրերի քանակից և տեսակից, որոնք ավելացվել են դրան:
sobes.tech AI
Պատասխան AI-ից
Ընդհանուր հիշողությունը, որը զբաղեցնում է զանգը, մոտավորապես բաղկացած է.
-
Զանգի ընդհանուր ծախսերը: Swift-ի ներքին կառուցվածքները զանգի կառավարման համար (օրինակ, հղման հաշվիչ, ծավալի և չափի մասին տեղեկություններ): Այս ծախսերը ֆիքսված են կամ կախված են ծավալից:
-
Զանգի տարրերի կողմից զբաղեցված հիշողությունը: կախված է տարրերի թվից և յուրաքանչյուր տարրի տիպից:
-
Արժեքային տիպեր (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).