链表
在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;
}
操作接口
定义一系列函数而已