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字节(考虑到结构体对齐)内存对齐是为了存取速度更快