PHP5数组下面的数据为什么引用计数是1,看了底层结构体实在想不明白

最近在研究PHP底层源码,看了PHP5的zval_struct结构体

struct _zval_struct{
    zvalue_value value;    //指针指向值
    zend_uint refcount__gc;   //引用计数
    zend_uchar type;   //类型
    zend_uchar is_ref_gc;  //是否是引用
}
union _zvalue_value{
    long lval
    double dval;
    struct {
        char *char;
        int len;
    } str;
    HashTable *ht;
    zend_object_value obj;
    zend_ast *ast;
}zvalue_value;

因为PHP5的引用计数是挂在zval_struct上面的,所以

$a = 123;

那么a的refcount_gc为1,is_ref_gc为0,这个很好理解
但是数组方便的话

$a = ["test"=>1234];

a的refcount_gc为1,is_ref_gc为0;test的refcount_gc为1,is_ref_gc为0
看了底层HashTable的结构体

struct bucket{
    ulong h;
    uint nKeyLength;
    void *pData;   //指向值的地址
    void *pDataPtr; //指向值的地址,一般为NULL
    const char *arkey;  ////指向键的地址
    ...
}
struct HashTable{
    ...
    bucket **arBuckets;
    ...
}

那么我理解的为如下图图片描述

我理解是数组a为结构体_zval_struct
_zval_struct.zvalue_value.ht表示hashtable
_zval_struct.zvalue_value.ht.arBuckets表示桶
buckets的pData和arkey分别为值和键

那么值对应的一个引用计数是哪里来的???

默认pData指向的是_zval_struct?????

如果指向的zval_struct那么为啥要void*啊???

刚看了下PHP5的源码,pData和pDataPtr是不指向_zval_struct的

clipboard.png

那么数组里面的值的1个引用计数是哪里来的???

阅读 850
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题