Zval (Zend value) — фундаментальная структура данных в ядре PHP, ответственная за хранение и обработку всех переменных. В этой статье мы исследуем её эволюцию, современную реализацию и практическое значение для разработчиков.
Историческая эволюция zval
PHP 5: Первое поколение
- 24-байтовая структура
- Универсальный подсчет ссылок
- Высокие накладные расходы
PHP 7: Революция
- 16 байт (экономия 33%)
- Разделение value/type
- Оптимизация скаляров
PHP 8: Совершенство
- Дополнительные оптимизации
- Интеграция с JIT
- Улучшенные хеш-таблицы
Структура zval в PHP 8
struct _zval_struct {
zend_value value; // 64-битное значение
union {
struct {
zend_uchar type; // Тип данных
zend_uchar type_flags; // Флаги поведения
zend_uchar const_flags; // Константность
zend_uchar reserved; // Выравнивание
} v;
uint32_t type_info;
} u1;
union u2 {
uint32_t next;
// ... служебные поля
};
}; // Всего 16 байт
Ключевые оптимизации
- Отказ от refcount для скаляров — целые числа и булевы значения больше не используют подсчет ссылок
- Copy-On-Write — сложные структуры копируются только при модификации
- Встроенное кеширование хешей — ускорение операций сравнения строк
- Оптимизированные хеш-таблицы — быстрый доступ к элементам массивов
Практическое применение для разработчиков и авторов расширений
- Оптимизация потребления памяти
- Эффективная работа с переменными
- Понимание поведения типов
Пример:
// Создание строки в расширении
zend_string *str = zend_string_init("test", 4, 0);
zval zv;
ZVAL_STR(&zv, str);
Добавить комментарий