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
。