typedef struct _zend_string zend_string;
zend_string是_zend_string的别名,_zend_string内容如下:
struct _zend_string { zend_refcounted_h gc; zend_ulong h; /* hash value */ size_t len; char val[1]; };
- zend_string定义了四个字段:
gc, h, len, val[1]
,先看下gc的定义,其zend_refcounted_h是一个结构体:
typedef struct _zend_refcounted_h { uint32_t refcount; /* reference counter 32-bit*/ union { struct { ZEND_ENDIAN_LOHI_3( zend_uchar type, // 类型标识 zend_uchar flags, /* used for strings & objects */ uint16_t gc_info) /* keeps GC root number (or 0) and color */ } v; uint32_t type_info; } u; } zend_refcounted_h; struct _zend_refcounted { zend_refcounted_h gc; };
该结构体用于垃圾回收机制,后续再做分析。
h是typedef uint64_t zend_ulong类型的一个变量,保存字符串对应的哈希值,其后续会用在数组里面。
len和val[1]用于标识字符串,c语言中字符串的表示形式可以以\0结尾,通过遍历得到字符串长度,但是其非二进制安全,如字符串中本身就包含\0,那么该字符串\0后面的字符串会被截断,这里len用于保存字符串的长度, val是一个柔性数组。实现的字符串是二进制安全的。
常量字符串的refcount默认是0, 变量字符串的refcount默认是1, 变量字符串是写时复制的,只有在修改字符串的时候才会进行拷贝,否则是将两个变量指向同一内存地址,refcount进行加1。