深入理解PHP7內核之HashTable

之前的倆篇文章深入理解PHP7內核之zval 深入理解PHP7內核之Reference, 我介紹了當時在開發PHP7的時候對zval和reference的一些改造思考和結果, 之後因爲確實精力有限就沒有繼續往下寫,時隔一年多以後,因爲這場突如其來的疫情,在家辦公的時間很多, 於是終於有了時間讓我來繼續介紹一下PHP7的中Hashtable的變化, 以及當時我們做這些變化背後的考量.
PHP5
對於PHP內核一直有關注的同學, 應該對PHP5的Hashtable會比較熟悉, 但我們還是先來簡單回顧一下PHP5的Hashtable:


在PHP5的實現中, Hashtable的核心是存儲了一個個指向zval指針的指針, 也就是zval**(我遇到不少的同學問爲什麼是zval**, 而不是zval*, 這個原因其實很簡單, 因爲Hashtable中的多個位置都可能指向同一個zval, 那麼最常見的一個可能就是在COW的時候, 當我們需要把一個變量指向一個新的zval的時候, 如果在符號表中存的是zval*, 那們我們就做不到對一處修改, 所有的持有方都有感知, 所以必須是zval**), 這樣的設計在最初的出發點是爲了讓Hashtable可以存儲任何尺寸的任何信息, 不僅僅是指針, 還可以存儲一段內存值(當然實際上大部分情況下,比如

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章