字符串(zend_string)

_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;

猜你喜欢

转载自blog.csdn.net/gripex/article/details/108413964