首页 > 代码库 > php底层--4 写时复制

php底层--4 写时复制

变量的赋值与引用

例如:$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=http://www.mamicode.com/5,refcount_gc=1;

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

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

php底层--4 写时复制