美文网首页
php hashtable 和zval

php hashtable 和zval

作者: littleDinosaur | 来源:发表于2018-02-02 13:13 被阅读0次

hashtable

hashtable 包括 :

  • 一个 gc 结构 ,是帮助垃圾回收而使用的
  • 一个联合体
  • 掩码
  • 桶指针 arData
  • 析构函数pDestructor
  • 桶的数目 nTableSize
    ...
// src\Zend\zend_types.h
typedef struct _zend_array HashTable;
struct _zend_array {
    zend_refcounted_h gc;
    union {
        struct {
            ZEND_ENDIAN_LOHI_4(
                zend_uchar    flags,
                zend_uchar    nApplyCount,
                zend_uchar    nIteratorsCount,
                zend_uchar    consistency)
        } v;
        uint32_t flags;
    } u;
    uint32_t          nTableMask;
    Bucket           *arData;
    uint32_t          nNumUsed;
    uint32_t          nNumOfElements;
    uint32_t          nTableSize;
    uint32_t          nInternalPointer;
    zend_long         nNextFreeElement;
    dtor_func_t       pDestructor;
};

然后是Bucket 结构

typedef struct _Bucket {
    zval              val;
    zend_ulong        h;                /* hash value (or numeric index)   */
    zend_string      *key;              /* string key or NULL for numerics */
} Bucket;

然后是zval

typedef struct _zval_struct     zval;

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     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 */
        uint32_t     access_flags;         /* class constant access flags */
        uint32_t     property_guard;       /* single property guard */
        uint32_t     extra;                /* not further specified */
    } u2;
};

继续上面的结构 _zval_struct , 我的代码的版本是php 7.1.8, 然后看到 ·_zval_struct 由以下几个部分组成

  • zend_val
  • 联合体 u1
  • 联合体u2
    u2 有一个next 的值可以实现关联数组相关的操作

zend_value; 然后到了zend_value
zend_value 是一个联合体,7.18 继续对zend_value 进行优化,缩小了zend_value的大小,可以节省非常多的内存

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;

相关文章

  • php hashtable 和zval

    hashtable hashtable 包括 : 一个 gc 结构 ,是帮助垃圾回收而使用的 一个联合体 掩码 桶...

  • php7变量实现_zval

    php5的变量实现 php通过一个zval结构体来实现变量,对于全局变量,php维护一个全局的hashtable,...

  • PHP7变量的内部实现

    PHP5中的zval PHP5中zval结构体的定义如下: 可以看到,zval由value、type和一些额外的_...

  • php7 zval及变量存储方式

    Zval是PHP中最重要的数据结构之一,它包含了PHP中变量的值和类型相关信息。 1. zval 1.1 zval...

  • 扩展中如何优雅的输出zval

    在扩展开发中,我们也会经常使用zval hashtable 这种php提供的数据结构,因为真的很方便,有这两个数据...

  • php7中的zval结构体

    php7中的zval结构体对比php5优化了很多,一个zval只占用16字节的空间,php7中的zval的结构体如...

  • php7的zval相关介绍

    在php7中变量主要由zval保存,只占用16个字节zval结构如下 zval主要由value u1 和u2保...

  • 引用

    php 引用变量 概念、定义、zval变量容器(用xdebug查看 xdebug_debug_zval('a'))...

  • PHP引用计数

    1. PHP官方手册引用计数介绍 引用计数每个php变量存在一个叫"zval"的变量容器中。一个zval变量容器,...

  • PHP5垃圾回收机制

    在了解垃圾回收机制之前我们必须先来看下zval结构。zval是用于保存变量以及常量的。 php5中的zval数据结...

网友评论

      本文标题:php hashtable 和zval

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