Sobes.tech
Middle

Koliko će ukupno memorije zauzeti niz u zavisnosti od broja i tipa elemenata koji su mu dodati?

sobes.tech АИ

Одговор од АИ

Ukupna memorija koju zauzima niz približno se sastoji od:

  1. Opšti troškovi niza: unutrašnje strukture Swift-a za upravljanje nizom (npr. brojanje referenci, informacije o kapacitetu i veličini). Ovi troškovi su fiksni ili zavise od kapaciteta.

  2. Memorija koju zauzimaju elementi: zavisi od broja elemenata i tipa svakog elementa.

    • Tipovi vrednosti (Value Types): na primer, Int, Double, Struct. Svaki primerak direktno čuva svoje podatke unutar niza. Veličina memorije za element je jednaka veličini tipa.

      // Veličina Int32 je 4 bajta na 64-bitnoj arhitekturi
      let intSize = MemoryLayout<Int32>.size // 4
      
    • Tipovi referenci (Reference Types): na primer, Class, String (za duge nizove), zatvaranja. Niz čuva samo reference na objekte. Veličina memorije za element je jednaka veličini reference (obično 8 bajta na 64-bitnoj arhitekturi). Objekti se čuvaju na hrpi, a njihova veličina ne utiče direktno na memoriju unutar niza.

      // Veličina reference na objekat (na primer, na instancu klase)
      let referenceSize = MemoryLayout<AnyObject>.size // 8 na 64-bitnoj
      

Formula (približno) izgleda ovako:

Ukupna memorija ≈ Troškovi niza + (Broj elemenata * Veličina elementa)

Veličina elementa za tipove vrednosti je MemoryLayout<ElementType>.size. Za tipove referenci — MemoryLayout<AnyObject>.size.

Takođe je važno razumeti mehanizam proširenja kapaciteta niza: kada niz dostigne svoj trenutni kapacitet, Swift obično dodeljuje novi, veći blok memorije (na primer, duplo veći) i kopira postojeće elemente u njega. To dovodi do privremenog povećanja potrošnje memorije tokom operacije proširenja i potencijalno do neiskorišćenog memorijskog prostora (capacity - count).