Ответ
Объем памяти, занимаемый массивом Array<T> в Swift, зависит от нескольких факторов:
- Количество элементов (
count). - Размер каждого элемента в памяти, который определяется его типом
T. - Внуней буфер (
capacity). Массив часто выделяет память с запасом для эффективного добавления новых элементов без переаллокации при каждомappend.
Формула для оценки (упрощенно):
Приблизительный размер ≈ (Размер элемента * capacity) + Накладные расходы
Примеры для разных типов:
-
Массив значений (Value Types, e.g.,
Int):let intArray = [1, 2, 3, 4, 5] // 5 элементов // На 64-битной системе Int занимает 8 байт. // При capacity = 5: ~ (8 * 5) + накладные расходы = ~40+ байт. // Накладные расходы (метаданные массива) обычно составляют 16-32 байта. -
Массив ссылок (Reference Types, e.g.,
UIView):let viewArray = [UIView(), UIView()] // 2 элемента // Массив хранит не сами объекты, а указатели (reference) на них. // Каждый указатель занимает 8 байт. // Размер: ~ (8 * capacity) + накладные расходы. Сами объекты UIView лежат отдельно в куче.
Как измерить точно:
Для отладки можно использовать MemoryLayout и CFArrayGetValues (для capacity), но точный размер управляется компилятором Swift и стандартной библиотекой.
// Размер типа (статически, не учитывает capacity)
let staticSize = MemoryLayout<Array<Int>>.size
// Пример оценки размера буфера
var array = [1, 2, 3]
let elementSize = MemoryLayout<Int>.stride // 8 байт
let estimatedBufferSize = array.capacity * elementSize
print("Емкость: (array.capacity), оценка буфера: (estimatedBufferSize) байт")
Ключевой вывод: Массив — это структура, которая хранит элементы в непрерывном регионе памяти. Для типов-значений (Int, String, struct) элементы хранятся внутри буфера массива. Для классов массив хранит только указатели.