Skip to main content

数组

typedef struct _zend_array HashTable;

struct _zend_array {
zend_refcounted_h gc; // 垃圾回收相关
union {
struct {
ZEND_ENDIAN_LOHI_4(
zend_uchar flags,
zend_uchar _unused,
zend_uchar nIteratorsCount,
zend_uchar _unused2)
} v;
uint32_t flags;
} u;
uint32_t nTableMask; // 计算最终落入哪个桶里的值,packed Array 初始值是-2 Hash Array 初始值是-8
Bucket *arData; // 数组
uint32_t nNumUsed; // 代表Bucket有多少个被使用 初始值 0
uint32_t nNumOfElements; // 真正有意义的值 unset函数后这个值会减少,nNumUsed不会减少 初始值 0
uint32_t nTableSize; // Bucket的大小 初始值8
uint32_t nInternalPointer; // 内部指针
zend_long nNextFreeElement; // 下一个自由元素 初始值 0
dtor_func_t pDestructor; // 析构用的
};

Bucket 的定义

typedef struct _Bucket {
zval val; // 存的是 key-value中的 value
zend_ulong h; /* hash value (or numeric index) hash算法算出来的hash值 */
zend_string *key; /* string key or NULL for numerics 存的是 key-value中的 key*/
} Bucket;

packed Array 递增的 前面索引数组只有有2个元素

Hash Array hash数组有多个元素前面就有多少个索引