-
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。