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=5,refcount_gc=1;
原来$a=3的那个结构体 refcount_gc=1;
也就是当值不改变的时候,$a,$b共用的一个结构体, refcount_gc=2;当其中一个发生改变时,复制分裂出一个来修改,这样在修改的时候发生结构体的复制改变的过程叫做写时复制(cow copy on write)。
越努力越幸运