Я продолжаю слышать, что у 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/