Sobes.tech
Middle

Mekkora lesz az össz memória, amit a tömb foglal el a hozzáadott elemek számától és típusától függően?

sobes.tech MI

Válasz az MI-től

Egy tömb által elfoglalt összmemória nagyjából a következőkből áll:

  1. A tömb általános költségei: a Swift belső struktúrái a tömb kezelésére (pl. hivatkozásszámolás, kapacitás- és méretinformációk). Ezek a költségek fixek vagy a kapacitástól függnek.

  2. Az elemek által elfoglalt memória: az elemek számától és típusától függ.

    • Értéktípusok (Value Types): például Int, Double, Struct. Minden példány közvetlenül a tömbben tárolja az adatait. Egy elem memória mérete megegyezik a típus méretével.

      // Az Int32 mérete 4 bájt 64 bites architektúrán
      let intSize = MemoryLayout<Int32>.size // 4
      
    • Referencia típusok (Reference Types): például Class, String (hosszú sztringekhez), zárójelek. A tömb csak hivatkozásokat tárol az objektumokra. Egy elem memória mérete megegyezik a hivatkozás méretével (általában 8 bájt 64 bites architektúrán). Az objektumok a heapen tárolódnak, és méretük nem befolyásolja közvetlenül a tömbben lévő memóriát.

      // Egy objektum hivatkozásának mérete (pl. egy osztály példánya)
      let referenceSize = MemoryLayout<AnyObject>.size // 8 64 bitesen
      

A (körülbelüli) képlet így néz ki:

Összes memória ≈ A tömb költségei + (Elemek száma * Elem mérete)

Az értéktípusok esetén az elem mérete MemoryLayout<ElementType>.size. A referencia típusoknál pedig MemoryLayout<AnyObject>.size.

Fontos továbbá a tömb kapacitásbővítési mechanizmusa: amikor a tömb eléri a jelenlegi kapacitását, a Swift általában egy új, nagyobb memória blokkot foglal (például, kétszer akkora), és átmásolja a meglévő elemeket. Ez ideiglenesen megnöveli a memóriafogyasztást a bővítés során, és potenciálisan kihasználatlan memóriát eredményez (capacity - count).