Sobes.tech
Middle

Qual será a memória total ocupada pelo array, dependendo do número e do tipo de elementos adicionados a ele?

sobes.tech IA

Resposta da IA

A memória total ocupada por um array é composta aproximadamente por:

  1. Custos gerais do array: as estruturas internas do Swift para gerir o array (por exemplo, contagem de referências, informações de capacidade e tamanho). Estes custos são fixos ou dependem da capacidade.

  2. Memória ocupada pelos elementos: depende do número de elementos e do tipo de cada elemento.

    • Tipos de valor (Value Types): por exemplo, Int, Double, Struct. Cada instância armazena os seus dados diretamente dentro do array. O tamanho de memória para um elemento é igual ao tamanho do tipo.

      // O tamanho de Int32 é 4 bytes numa arquitetura de 64 bits
      let intSize = MemoryLayout<Int32>.size // 4
      
    • Tipos de referência (Reference Types): por exemplo, Class, String (para cadeias longas), closures. O array apenas armazena referências a objetos. O tamanho de memória para um elemento é igual ao tamanho da referência (geralmente 8 bytes numa arquitetura de 64 bits). Os objetos em si são armazenados no heap, e o seu tamanho não afeta diretamente a memória dentro do array.

      // O tamanho de uma referência a um objeto (por exemplo, a uma instância de classe)
      let referenceSize = MemoryLayout<AnyObject>.size // 8 em 64 bits
      

A fórmula (aproximada) é:

Memória total ≈ Custos do array + (Número de elementos * Tamanho do elemento)

O tamanho do elemento para tipos de valor é MemoryLayout<ElementType>.size. Para tipos de referência, é MemoryLayout<AnyObject>.size.

Também é importante o mecanismo de expansão de capacidade do array: quando o array atinge a sua capacidade atual, o Swift geralmente aloca um novo bloco de memória maior (por exemplo, o dobro do tamanho) e copia os elementos existentes para lá. Isto leva a um aumento temporário no consumo de memória durante a operação de expansão e potencialmente a memória não utilizada (capacity - count).