天天看点

php内核-数据类型之字符串

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指向具体的结构。

  1. gc 变量的引用计数信息,用于内存管理
  2. h 字符串通过Times 33算法计算得到的Hash Code
  3. len 字符串长度
  4. 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