关于PHP5的数组底层bucket结构体,为什么要有pData和pDataPtr

新手上路,请多包涵

最近在研究PHP的底层源码,十分懵逼,PHP5数组是一个hashtable,里面的bucket桶的结构体如下

typedef struct bucket{
    ulong h;
    uint nkeyLenght;
    void *pData;
    void *pDataPtr;
    struct bucket *pListNext;
    struct bucket *pListLast;
    struct bucket *pNext;
    struct bucket *pLast;
    const char *arkey;
}Bucket;

pData和pDataPtr都是指针,占8个字节,表示数组的值,一般值都存储在pData所指向的内存空间,pDataPtr为NULL空指针

我看了陈雷大佬写的PHP源码书,说

"如果value的大小等于一个指针的大小,那么将不会额外的申请内存空间存这个指针,而是直接存储在pDataPtr上,再让pData指向pDataPtr,可以减少内存碎片"

我感觉非常懵逼
1.啥叫如果value的大小等于一个指针大小???
2.pDataPtr是占用空间的,即使指向了NULL也是8个字节,为啥不让所有的值都存在pData指向的地址呢????每次pDataPtr都会浪费8个字节的空间啊

感觉这个pDataPtr好多余

阅读 1.9k
1 个回答
  1. 比如在指針大小爲 8 字節,如果 sizeof(value) 小於或等於 8 字節,就可以直接存在 pData 中
  2. 申請內存需要切換到內核態,開銷會很大。這樣可以避免爲數據申請內存帶來的開銷。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题