Sobes.tech
Middle

Ҳаҷми умумии хотирае, ки массив бо вобастагии аз шумора ва навъи унсурҳое, ки ба он илова карда мешаванд, мегирад, чӣ қадар хоҳад буд?

sobes.tech AI

Ҷавоб аз AI

Нийт ойгон хураамж ойгогдсон санамжийн ойролцоогоор дараах хэсгүүдээс бүрдэнэ:

  1. Санамжийн ерөнхий зардал: Swift-ийн дотоод бүтэц, жишээ нь, ишлэл тоолох, багтаамж, хэмжээ мэдээлэл гэх мэт. Эдгээр зардлууд тогтмол эсвэл багтаамжид хамаарна.

  2. Элементүүдийн эзэлж буй санах ой: элементийн тоо болон төрөл дээр хамаарна.

    • Үнэтэй төрөл (Value Types): жишээ нь, Int, Double, Struct. Тодорхой нэг жишээ нь шууд массив доторх өгөгдлөө хадгалдаг. Элементийн санах ойн хэмжээ нь төрөлтийн хэмжээтэй тэнцүү.

      // Int32-ийн хэмжээ 64 битийн архитектур дээр 4 байт
      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) үүсгэж болно.