[李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型--链表

49 篇文章 0 订阅

链表


在Zend引擎中Hash Table的使用非常频繁,这得益于他良好的查找性能。
哈希表会预先分配内容以提高性能,而很多时候数据规模不会很大,固然使用哈希表能提高查询性能,但是某些场景下并不会对数据进行随机查找,这时使用哈希表有点浪费了。

zend引擎中的连表是双链表,通过双链表的任意节点都能方便的对链表进行遍历。

链表的实现很简单,通常只需要是三个关键元素:

1 指向上个元素指针
2 指向下个元素的指针
3 数据容器

Zend引擎的实现也很简单,如下两个核心的数据接口,第一个是元素节点,第二个是链表容器。

typedef struct _zend_llist_element{
     struct _zend_llist_element *next;
     struct _zend_llist_element *prev;
     char data[1];// Needs to always be last in the struct
}zend_llist_element;

typedef struct _zend_llist{
     zend_llist_element *head;
     zend_llist_element *tail;
     size_t count;
     size_t size;
     llist_dtor_func_t dtor;
     unsigned char persistent;
     zend_llist_element *traverse_ptr;
}zend_llist;

对应关系如下图:

这里写图片描述

上面的data字段的空间并不是只有一个字节,我们来看一下插入的实现:

ZEND_API void zend_llist_add_element(zend_llist *l,void *element)
{
     zend_llist_element *tmp = pemalloc(sizeof(zend_llist_element)+l->size -1 ,l->persistent);
     tmp->prev = l->tail;
     tmp->next = NULL;
     if(l->tail){
          l->tail->next = tmp;
     }else{
          l->head = tmp;
     }
     l->tail = tmp;
     memcpy(tmp->data,element,l->size);
     ++l->count;
}

操作接口


定义一系列函数而已

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值