php的引用计数和写时复制
a: (refcount=1, is_ref=0)=1a: (refcount=2, is_ref=0)=1
b: (refcount=1, is_ref=0)=2
a: (refcount=1, is_ref=0)=1
过程分析:
1,$a 创建了 引用计数(指向数)为1,非地址引用 并且 值为int类型 1 的 zval容器;
2,新建一个$b,由于是通过赋值的方式将 $a 赋值给 变量$b 的,两个变量所保存的值完全一样,因此不会申请新内存来存放新变量所保存的值,而是简单的通过一个计数器来共用内存。所以,此时$b也指向 $a 的zval 容器,可以看到引用计数变为了2,仍然是非地址引用;
3,将$a的值赋值为 2,值发生了该表,由于该zval 容器非地址引用,所以系统会重新创建一个 引用计数(指向数)为1,非地址引用并且值为int类型2 的新的zval 容器 指向$a ,由于 $a 不再指向原zval容器,所以原容器的 引用计数(指向数) 减 1。
总结: 当通过值传递方式进行赋值时,由于两个变量保存的值完全一样,为了 复用内存,PHP不会为新变量申请新的内存来存放值,而只是在原 zval 容器中将引用计数+1。只有当两个变量中的任何一个变量的值发生改变时,PHP才会重新为发生 值改变 的那个变量申请一个新内存,创建一个新的zval容器。
以上内容 就是php内核的一个重要的特性:引用计数 与 写时复制 原理。
以上是 php的引用计数和写时复制 的全部内容, 来源链接: utcz.com/z/515073.html