美文网首页
PHP之zval的实现

PHP之zval的实现

作者: onefiter | 来源:发表于2021-07-01 22:39 被阅读0次

    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的实现

          本文链接:https://www.haomeiwen.com/subject/dhpsultx.html