PHP の HashTable を読む #1
前回は PHP の zval 構造体についてまとめた.
ここからは, zval 構造体の value メンバに配列として格納される HashTable という構造体について調べる.
今回の記事でも GitHub における php/php-src の commit c5d10ddda394b573dfaea1380285e1dd5f3c0d50 を前提としている.
HashTable 構造体は ./Zend/zend_hash.h において以下のように定義されている.
各メンバの名前を観る限りでは, メタデータとしてハッシュテーブルの大きさ, 要素の数などと思われる, 様々な値が格納されているとわかる.
PHP の zval を読む #3 で読んだ php_count_recursive 関数を再び読んでみよう.
これは zval 中の配列から要素数を数える関数で, ./ext/standard/array.c で定義されていた.
Z_ARRVAL_P マクロが zval のポインタから value, そしてその中の ht メンバを取り出していることも PHP の zval を読む #3 で読んだ.
この ht メンバが HashTable 構造体だった.
それでは zend_hash_num_elements 関数を読んでみよう.
これは ./Zend/zend_hash.c で定義されている.
何ということもなく, HashTable 構造体のポインタから nNumOfElements メンバを取り出しているだけである.
(IS_CONSISTENT マクロはデバッグ用の処理だろうか)
ということで PHP の配列は要素数を持っており, PHP の count 関数の適用時には再計算は行われていない, ということがわかった.
また, おそらく配列に要素を追加, または削除したときなどは nNumOfElements の値も書き換えられているであろうことが予想される.
次回は配列の操作について調べてみようと思う.