_zend_string
typedef struct _zend_string zend_string;
struct _zend_string {
zend_refecounted_h gc; // 用于垃圾回收
zend_ulong h; // 空间换时间,用于做hash运算,之后用在数组中
/* len + val[1], 增加存储长度, 组成二进制安全的数组 */
size_t len; // 长度
char val[1]; // 字符数组
}
整形等简单类型,采用直接复制的方式。 对于zend_string类型采用读时共享写时复制的方式
zend_refecounted_h
typedef struct _zend_refcounted_h {
uint32_t refcount;
/* 引用计数器 32-bit ,对于如整形的简单的类型,zend采用直接复制的方式。而zend_string采用读时共享,写时复制的形式管理内存 */
/**
$a = 1;
$b = $a; // 此时$a $b 占用不同的地址空间
$str1 = "aaaaa";
$str2 = $str1; // 此时读时共享,$str1 的引用计数器加1(refcount)加1, $str1 $str2指向相同的zend_string(地址空间)
$str2 = "bbbbb; // 这是写时复制, $str2指向了"bbbbb"存储的空间
**/
union {
struct {
ZEND_ENDIAN_LOHT_3 (
zend_uchar type,
zend_uchar flags, /* 用于string 或 object */
uint16_t gc_info)
} v;
uint32_t type_info;
} u;
} zend_refcounted_h;