მთლიანი მეხსიერება რა იქნება მასივში, დამოკიდებულია მასში დამატებული ელემენტების რაოდენობაზე და ტიპზე?
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-ბიტიან არქიტექტურაზე). თვითონ ობიექტები ინახება მყუდროში, და მათი ზომა პირდაპირ არ ზემოქმედებს მასივის მეხსიერებაზე.// ბმულის ზომა ობიექტზე (მაგალითად, კლასის ეგზემპლარზე) let referenceSize = MemoryLayout<AnyObject>.size // 8 64-ბიტიანზე
-
ფორმულა (დაახლოებით) ასე გამოიყურება:
საერთო მეხსიერება ≈ მასივის ზედმეტი ხარჯები + (ელემენტების რაოდენობა * ელემენტის ზომა)
ელემენტის ზომა მნიშვნელობის ტიპებისთვის — ეს არის MemoryLayout<ElementType>.size. გაშუქების ტიპებისთვის — MemoryLayout<AnyObject>.size.
ასევე მნიშვნელოვანია მასივის მოცულობის გაფართოების მექანიზმი: როდესაც მასივი აღწევს თავის მიმდინარე მოცულობას, Swift ჩვეულებრივ გამოყოფს ახალ, უფრო დიდ მეხსიერების ბლოკს (მაგალითად, ორმაგად დიდს) და კოპირებს მასში არსებულ ელემენტებს. ეს იწვევს დროებით მეხსიერების გაზრდას გაფართოების ოპერაციის დროს და პოტენციურად არასარგებლო მეხსიერებას (capacity - count).