Sobes.tech
Middle

Wie viel Gesamtspeicher wird das Array je nach Anzahl und Typ der hinzugefügten Elemente belegen?

sobes.tech KI

Antwort von AI

Der insgesamt vom Array belegte Speicher setzt sich ungefähr zusammen aus:

  1. Allgemeine Kosten des Arrays: die internen Strukturen von Swift zur Verwaltung des Arrays (z.B. Referenzzählung, Kapazitäts- und Größeninformationen). Diese Kosten sind fix oder abhängig von der Kapazität.

  2. Speicher, der von den Elementen belegt wird: hängt von der Anzahl der Elemente und vom Typ jedes Elements ab.

    • Werttypen (Value Types): z.B. Int, Double, Struct. Jede Instanz speichert ihre Daten direkt im Array. Die Speichergröße eines Elements entspricht der Größe des Typs.

      // Die Größe von Int32 ist 4 Bytes auf einer 64-Bit-Architektur
      let intSize = MemoryLayout<Int32>.size // 4
      
    • Referenztypen (Reference Types): z.B. Class, String (für lange Strings), Closures. Das Array speichert nur Referenzen auf Objekte. Die Speichergröße eines Elements entspricht der Größe der Referenz (meist 8 Bytes auf einer 64-Bit-Architektur). Die Objekte selbst werden im Heap gespeichert, und ihre Größe beeinflusst den Speicher im Array nicht direkt.

      // Die Größe einer Referenz auf ein Objekt (z.B. auf eine Klasseninstanz)
      let referenceSize = MemoryLayout<AnyObject>.size // 8 auf 64-Bit
      

Die Formel (ungefähr) lautet:

Gesamtspeicher ≈ Array-Overhead + (Anzahl der Elemente * Größe des Elements)

Die Größe des Elements bei Werttypen ist MemoryLayout<ElementType>.size. Bei Referenztypen ist es MemoryLayout<AnyObject>.size.

Wichtig ist auch der Mechanismus der Kapazitätserweiterung: Wenn das Array seine aktuelle Kapazität erreicht, weist Swift in der Regel einen neuen, größeren Speicherblock zu (z.B. doppelt so groß) und kopiert die bestehenden Elemente hinein. Dies führt zu einem temporären Anstieg des Speicherverbrauchs während der Erweiterung und möglicherweise zu ungenutztem Speicher (capacity - count).