php中字元串的結構
type struct _zend_string zend_string;
struct _zend_string {
zend_refcounted_h gc;
zend_ulong h; /* hash value */
size_t len;
char val[1];
};
zend_value中通過str指向具體的結構。
- gc 變量的引用計數資訊,用于記憶體管理
- h 字元串通過Times 33算法計算得到的Hash Code
- len 字元串長度
- val 字元串内容
為什麼使用char[] 而不是用char* ?
val[1]并不是他隻想存儲一個位元組,在
zend_string
字元串配置設定時使用的是
malloc(sizeof(zend_string) + len))
,會額外再申請一部分記憶體,并且多申請的這部分記憶體是與
zend_string
連在一起的,
val[0]
對應的記憶體位址為整個字元串内容的起始位址。
val[0]
一直到整個連續記憶體的結束為止,都是字元串的内容。
如果
val
是個
char*
指針,那麼還需要對應另一塊位址存儲字元串真正的内容,多了一次記憶體配置設定操作。
此外,使用定長數組也有利于記憶體回收,free時直接釋放整個
zend_string
的記憶體即可。
val
中會多出一個位元組用于存儲字元串的最後一個字元
\0
。