I 开发者_开发问答keep hearing that PHP has overhead. For example a C++ int uses 4 Bytes on a 32 bit system but a PHP int uses more. What is this value?
I need more space than a comment to expand on mario's findings so I'll add an answer instead.
The size of a C union
will be the size of its largest member (possibly with extra bytes to satisfy alignment constraints). For zvalue_value
, that would be the obj
which has the size of three pointers (not including the memory required for what those pointers point to):
typedef struct _zend_object {
zend_class_entry *ce;
HashTable *properties;
HashTable *guards; /* protects from __get/__set ... recursion */
} zend_object;
On a 32bit system, a zend_object
will take 24 bytes while on a 64bit system it will take 48 bytes. So, every zvalue_value
will take at least 24 or 48 bytes regardless of what data you store in it. There's also the name of the variable which consumes more memory; compiled languages generally discard the names once the compiler is done and treat values as simple sequences of bytes (so a double
takes eight bytes, a char
takes one byte, etc...).
With regards to your recent questions about PHP booleans, a simple boolean value will consume 24 or 48 bytes for the value, plus a few more bytes for the name, plus four or eight for the zend_unit
, plus four (or eight) for the two zend_uchar
s in this:
struct _zval_struct {
/* Variable information */
zvalue_value value; /* value */
zend_uint refcount__gc;
zend_uchar type; /* active type */
zend_uchar is_ref__gc;
};
The zend_uchar
members will chew up four (or eight) bytes due to alignment constraints, almost every CPU wants to access memory on natural address boundaries and that means that a single byte sized member of a struct
will take up four bytes or eight bytes of memory (depending on the CPUs natural word size and alignment constraints). So, a boolean will take somewhere between 36 and 72 bytes of memory.
PHP does not just store an C int
. It needs to keep type information and whatnot for each value. Each variable also needs an entry in one of the variable scope hash tables.
Not sure if this is the right snippet, but basically look for zval
in the PHP source:
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;
Most integer-like types use at least a long
. (Which I assume would include the booleans from your previous questions.)
http://porteightyeight.com/2008/03/18/the-truth-about-php-variables/
精彩评论