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
。