PHP7变量在内核中存储方式

来源:互联网 发布:h5单页商品详情源码 编辑:程序博客网 时间:2024/06/09 21:27
PHP7终于千呼万唤始出来,今天想通过查看源码看看变量中的存储方式,并计算剩了多少内存。

先看看PHP7(PHP5.3.17)之前变量的相关代码。

typedef unsigned int zend_object_handle;typedef struct _zend_object_value {        zend_object_handle handle;        zend_object_handlers *handlers;} zend_object_value;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;struct _zval_struct {        /* Variable information */        zvalue_value value;             /* value */        zend_uint refcount__gc;        zend_uchar type;        /* active type */        zend_uchar is_ref__gc;};
在32位系统中一个变量的大小为16字节。

再看看PHP7中变量的相关代码。

typedef union _zend_value {        zend_long         lval;                         /* long value */        double            dval;                         /* double value */        zend_refcounted  *counted;        zend_string      *str;        zend_array       *arr;        zend_object      *obj;        zend_resource    *res;        zend_reference   *ref;        zend_ast_ref     *ast;        zval             *zv;        void             *ptr;        zend_class_entry *ce;        zend_function    *func;        struct {                uint32_t w1;                uint32_t w2;        } ww;} zend_value;struct _zval_struct {        zend_value        value;                        /* value */        union {                struct {                        ZEND_ENDIAN_LOHI_4(                                zend_uchar    type,                     /* active type */                                zend_uchar    type_flags,                                zend_uchar    const_flags,                                zend_uchar    reserved)     /* call info for EX(This) */                } v;                uint32_t type_info;        } u1;        union {                uint32_t     var_flags;                uint32_t     next;                 /* hash collision chain */                uint32_t     cache_slot;           /* literal cache slot */                uint32_t     lineno;               /* line number (for ast nodes) */                uint32_t     num_args;             /* arguments number for EX(This) */                uint32_t     fe_pos;               /* foreach position */                uint32_t     fe_iter_idx;          /* foreach iterator index */        } u2;};
在32位系统中一个变量的大小为16字节。


0 0
原创粉丝点击