php7 zend_string与写时复制

前言

在讲zend_string之前,需要先了解下zval,如果还不了解zval是什么,可以先去我的这篇文章看下
https://blog.csdn.net/onlymayao/article/details/104783731

zend_string是什么

php的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:指的是垃圾回收,*关键点是refcount引用计数,相信大家都听说过,结构体如下

typedef struct _zend_refcounted_h {
        uint32_t         refcount;                      /* reference counter 32-bit */
        union {
                uint32_t type_info;
        } u;
} zend_refcounted_h;

h:指的是字符串对应的hash值,后边会用在数组里面
len:长度
val:字符串内容

php string 是否是二进制安全的

是,因为len表示长度val表示字符串,可以根据len去取val,即时中间有\0,也一样可以把整个字符串取出来。

写时复制

对于整型和其他简单的类型,因为是zval,16个字节可以表示,所以直接复制了,对于string

$a = 'abc';
$b = $a;

此时的 a 和 a和 ab都是一个zval,它们的str指向的是同一个zend_string,这样我的内容只有一份,节约了空间,用gc中refcount标记,此时,refcount变成了2,表示被2个引用,当我们修改b的时候,a还是指向zval,指向zend_string,b开始复制一份在上面进行修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值