Сколько памяти потребуется при добавлении элемента размером в 1 байт в массив PHP, который уже полностью заполнил выделенную емкость?

«Сколько памяти потребуется при добавлении элемента размером в 1 байт в массив PHP, который уже полностью заполнил выделенную емкость?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В PHP при добавлении элемента в массив, достигший своей текущей емкости (capacity), происходит переаллокация. Потребление памяти будет значительно больше одного байта.

Основные факторы:

  1. Структура zval: Каждый элемент массива в PHP 7+ хранится как zval, что занимает 56 байт (на 64-битной системе).
  2. Переаллокация массива: При превышении capacity PHP выделяет новый, больший блок памяти. Коэффициент роста обычно составляет 1.5-2 раза от текущего размера.
  3. Структура хэш-таблицы: Сам массив (хэш-таблица) имеет служебные структуры для управления ключами и порядком.

Пример:

// Допустим, массив из 1000 элементов занял ровно 1 МБ.
$array = range(1, 1000);

// Добавление одного элемента вызовет переаллокацию.
$array[] = 'a'; // 1 байт данных
// PHP может выделить новый блок памяти размером ~2 МБ.

Итог: Фактическое потребление памяти будет равно *новой емкости массива размер zval + служебные структуры**. Добавление 1 байта данных может привести к увеличению потребления памяти на мегабайты. Для точных цифр можно использовать memory_get_usage().