PHP之zval的实现

PHP5中zval中的实现

基于php-5.6.40 中php-5.6.40/Zend/zend.h

319 #include "zend_object_handlers.h"
320 #include "zend_ast.h"
321
322 typedef union _zvalue_value {
323         long lval;                                      /* long value */
324         double dval;                            /* double value */
325         struct {
326                 char *val;
327                 int len;
328         } str;
329         HashTable *ht;                          /* hash table value */
330         zend_object_value obj;
331         zend_ast *ast;
332 } zvalue_value;
333
334 struct _zval_struct {
335         /* Variable information */
336         zvalue_value value;             /* value */
337         zend_uint refcount__gc;
338         zend_uchar type;        /* active type */
339         zend_uchar is_ref__gc;
340 };

PHP5的zval核心由一个zvalue_value类型的联合体和zend_uchar类型的type组成。在PHP5.3之后相继引入了refcount__gc字段通过引用计数进行垃圾回收,同时增加了新的字段is_ref__gc来标记是否为引用类型。默认在i386:x86-64架构下,上面的zvalue_value结构体中lval和dval大小为8字节,str结构体大小为12字节,ht和ast是指针类型,大小为8字节,obj结构体大小为12字节,所以在内存对齐的情况下_zval_struct中的value大小为16字节,加上refcount__gc大小为4字节和两个1字节的type、is_ref__gc, _zval_struct结构体本身大小为24字节(考虑到结构体对齐)内存对齐是为了存取速度更快

你可能感兴趣的:(PHP之zval的实现)