Каковы накладные расходы на использование PHP int?

Я продолжаю слышать, что у PHP есть накладные расходы. Например, C ++ int использует 4 байта в 32-битной системе, но PHP int использует больше. Что это за значение?

    Мне нужно больше места, чем комментарий, чтобы расширять выводы Марио, поэтому я добавлю вместо этого ответ.

    Размер C- union будет размером с его наибольшим членом (возможно, с дополнительными байтами, чтобы удовлетворить ограничениям выравнивания). Для zvalue_value это будет obj , размер которого имеет три указателя (не считая памяти, для которой указывают эти указатели):

     typedef struct _zend_object { zend_class_entry *ce; HashTable *properties; HashTable *guards; /* protects from __get/__set ... recursion */ } zend_object; 

    В 32-битной системе zend_object будет принимать 24 байта, а в 64-битной системе – 48 байт. Таким образом, каждое значение zvalue_value будет занимать не менее 24 или 48 байтов, независимо от того, какие данные вы храните в нем. Также есть имя переменной, которая потребляет больше памяти; скомпилированные языки обычно отбрасывают имена после завершения компилятора и обрабатывают значения как простые последовательности байтов (так что double занимает восемь байтов, char принимает один байт и т. д.).

    Что касается ваших последних вопросов о PHP booleans, простое логическое значение будет потреблять 24 или 48 байт для значения, плюс еще несколько байтов для имени, плюс четыре или восемь для zend_unit , плюс четыре (или восемь) для двух zend_uchar s в этом:

     struct _zval_struct { /* Variable information */ zvalue_value value; /* value */ zend_uint refcount__gc; zend_uchar type; /* active type */ zend_uchar is_ref__gc; }; 

    Члены zend_uchar будут zend_uchar четыре (или восемь) байтов из-за ограничений выравнивания, почти каждый процессор хочет получить доступ к памяти на естественных границах адреса, а это означает, что один размер элемента в байтах struct будет занимать четыре байта или восемь байт памяти (в зависимости от размера естественного слова процессора и ограничений выравнивания). Таким образом, логическое значение будет занимать от 36 до 72 байт памяти.

    PHP не просто сохраняет C int . Он должен хранить информацию о типе и многое другое. Каждой переменной также нужна запись в одной из хэш-таблиц переменной области.

    Не уверен, что это правильный фрагмент, но в основном искать zval в источнике PHP:

     struct _zval_struct { /* Variable information */ zvalue_value value; /* value */ zend_uint refcount__gc; zend_uchar type; /* active type */ zend_uchar is_ref__gc; }; typedef union _zvalue_value { long lval; /* long value */ double dval; /* double value */ struct { char *val; int len; } str; HashTable *ht; /* hash table value */ zend_object_value obj; } zvalue_value; 

    Большинство целочисленных типов используют как минимум long . (Я предполагаю, что будет включать логические элементы из ваших предыдущих вопросов.)

    http://porteightyeight.com/2008/03/18/the-truth-about-php-variables/