码迷,mamicode.com
首页 > Web开发 > 详细

php底层--4 写时复制

时间:2016-10-23 20:47:18      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:改变   是什么   赋值   引用   php   span   log   div   变量   

变量的赋值与引用

例如:$a=3;

   $b=$a;

这个时候是否就产生了2个结构体呢?

    No,如果是的话,这两个结构体的type,value全都一样,很浪费呀,所以在PHP实现的时候并没有copy一个结构体出来,而是$a,$b共用一个结构体。

  在传值赋值时,并没有新生结构体,而是共用的。

$a=3;
产生一个结构体
zvalue:3;
type:IS_LONG;
refcount_gc:1;
is_ref_gc:0;
$b=$a;
这个时候并没有新产生一个结构体,而是原来的结构体
refcount_gc=2;
也就是说,这样一个结构体被$a,$b共用,refcount_gc=2;
a,b在符号表里面都指向了这个结构体的内存地址。
节省了空间,并没有发生结构体的复制。

问题:$a,$b共用一个结构体,如果我修改$b=5,岂不是$a也受到了干扰?按照php 的逻辑,这是传值赋值,

$a=3,$b=5 显然$a是没有受到干扰的,这是什么原理呢?

 答:cow  写时复制。

  当底层发现$b=5;value值变了,这时候在复制出一个新的结构体出来,zvalue=5,refcount_gc=1;

原来$a=3的那个结构体 refcount_gc=1;

  也就是当值不改变的时候,$a,$b共用的一个结构体, refcount_gc=2;当其中一个发生改变时,复制分裂出一个来修改,这样在修改的时候发生结构体的复制改变的过程叫做写时复制(cow copy on write)。

php底层--4 写时复制

标签:改变   是什么   赋值   引用   php   span   log   div   变量   

原文地址:http://www.cnblogs.com/tianye8123/p/5990744.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!