Zend引擎中對HashTable的各種操作

2021-06-07 09:19:23 字數 2675 閱讀 8002

一邊學習c,一邊研究zend引擎,邊學習邊總結。

hashtable的初始化:

zend_api int _zend_hash_init(hashtable *ht, uint nsize, hash_func_t phashfunction, dtor_func_t pdestructor, zend_bool persistent zend_file_line_dc)

else

ht->ntablesize = 1 << i;

}// tablemask 為最高位為0,其他位均為1的數

// bucket 在 hashtable 中的位置,通過 hash 值與 tablemask 來決定

ht->ntablemask = ht->ntablesize - 1;

// 儲存指向析構函式的指標

ht->pdestructor = pdestructor;

ht->arbuckets = null;

ht->plisthead = null;

ht->plisttail = null;

ht->nnumofelements = 0;

ht->nnextfreeelement = 0;

ht->pinternalpointer = null;

ht->persistent = persistent;

/* uses ecalloc() so that bucket* == null */

if (persistent)

ht->arbuckets = tmp;

} else

}return success;

}

向hashtable中增加或更新元素:

zend_api int _zend_hash_add_or_update(hashtable *ht, const char *arkey, uint nkeylength, void *pdata, uint ndatasize, void **pdest, int flag zend_file_line_dc)

// 根據鍵的名稱和長度求出hash值

h = zend_inline_hash_func(arkey, nkeylength);

// 將hash值與hashtable的mask相與,得出該鍵值在hashtable中的儲存位置為 nindex

nindex = h & ht->ntablemask;

// 將二維陣列arbucket第一維下標為 nindex 的 bucket 陣列賦值給 p

p = ht->arbuckets[nindex];

// 迴圈這個陣列,直到最後乙個元素,迴圈結束後p處於 bucket 陣列的最後乙個位置

while (p != null)

handle_block_interruptions();

#if zend_debug

if (p->pdata == pdata)

#endif

// 程式沒有在前面 return ,說明是更新已有元素

// 將當前儲存的資料解構

if (ht->pdestructor)

// 更新資料

update_data(ht, p, pdata, ndatasize);

// 如果需要返回更新後的資料,返回給pdest變數

if (pdest)

handle_unblock_interruptions();

// 如果更新成功,返回

return success;}}

// 移向 bucket 陣列的下乙個元素

p = p->pnext;

}// 如果是新增,並且沒有重複的元素,繼續往下執行

// 因為bucket陣列的最後乙個元素是陣列,所以可以實現可變長的儲存

// 由於 struct bucket 在定義的時候 arkey 長度為1,所以先-1,然後再分配nkeylength的長度

p = (bucket *) pemalloc(sizeof(bucket) - 1 + nkeylength, ht->persistent);

if (!p)

// 賦值

memcpy(p->arkey, arkey, nkeylength);

p->nkeylength = nkeylength;

init_data(ht, p, pdata, ndatasize);

p->h = h;

connect_to_bucket_dllist(p, ht->arbuckets[nindex]);

if (pdest)

handle_block_interruptions();

connect_to_global_dllist(p, ht);

ht->arbuckets[nindex] = p;

handle_unblock_interruptions();

// hashtable 儲存的元素加1

ht->nnumofelements++;

zend_hash_if_full_do_resize(ht);        /* if the hash table is full, resize it */

return success;

}

(持續更新中……)

Zend引擎的優化

在php 5.4的更新list上,有一句 提公升了zend引擎的效能,減少了記憶體占用.那麼,到底是怎麼提公升的呢?我們知道在php中,類的屬性 靜態屬性 常量,都是儲存在hashtable中的,而在以前,即使乙個類沒有申明屬性 靜態屬性 常量,zend引擎也會為他們分配hashtable.而在現在...

Zend引擎的優化

在php 5.4的更新list上,有一句 提公升了zend引擎的效能,減少了記憶體占用.那麼,到底是怎麼提公升的呢?我們知道在php中,類的屬性 靜態屬性 常量,都是儲存在hashtable中的,而在以前,即使乙個類沒有申明屬性 靜態屬性 常量,zend引擎也會為他們分配hashtable.而在現在...

PHP核心 Zend引擎

在前面的章節介紹了php的生命週期,php的sapi,sapi處於php整個架構較上層,而真正指令碼的執行主要由zend引擎來完成,這一小節我們介紹php指令碼的執行。目前程式語言可以分為兩大類 但它們並不是真的直接就被能被機器理解,機器只能理解機器語言,那這些語言是怎麼被執行的呢,一般這些語言都需...