Sobes.tech
Middle

Ile będzie zajmowała pamięć cała tablica, w zależności od liczby i typu dodanych do niej elementów?

sobes.tech AI

Odpowiedź od AI

Całkowita pamięć zajmowana przez tablicę składa się mniej więcej z:

  1. Kosztów ogólnych tablicy: wewnętrznych struktur Swift do zarządzania tablicą (np. licznik odwołań, informacje o pojemności i rozmiarze). Koszty te są stałe lub zależą od pojemności.

  2. Pamięci zajmowanej przez elementy: zależy od liczby elementów i typu każdego elementu.

    • Typy wartości (Value Types): np. Int, Double, Struct. Każdy egzemplarz przechowuje swoje dane bezpośrednio w tablicy. Rozmiar pamięci dla elementu jest równy rozmiarowi typu.

      // Rozmiar Int32 to 4 bajty na architekturze 64-bitowej
      let intSize = MemoryLayout<Int32>.size // 4
      
    • Typy referencyjne (Reference Types): np. Class, String (dla długich łańcuchów), funkcje anonimowe. Tablica przechowuje tylko odwołania do obiektów. Rozmiar pamięci dla elementu jest równy rozmiarowi odwołania (zazwyczaj 8 bajtów na architekturze 64-bitowej). Obiekty same są przechowywane na stercie, a ich rozmiar nie wpływa bezpośrednio na pamięć wewnątrz tablicy.

      // Rozmiar odwołania do obiektu (np. do instancji klasy)
      let referenceSize = MemoryLayout<AnyObject>.size // 8 na 64-bitach
      

Formuła (przybliżona) wygląda tak:

Całkowita pamięć ≈ Koszty tablicy + (Liczba elementów * Rozmiar elementu)

Rozmiar elementu dla typów wartości to MemoryLayout<ElementType>.size. Dla typów referencyjnych to MemoryLayout<AnyObject>.size.

Ważne jest również mechanizm rozszerzania pojemności tablicy: gdy tablica osiąga swoją obecną pojemność, Swift zazwyczaj przydziela nowy, większy blok pamięci (np. dwukrotnie większy) i kopiuje do niego istniejące elementy. To prowadzi do tymczasowego zwiększenia zużycia pamięci podczas operacji rozszerzania i potencjalnie do nieużywanej pamięci (capacity - count).