首页 > 代码库 > 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 写时复制
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。