php写时复制

背景:

我们定义两个变量a和b,并且他们的值都是1。站在内存角度考虑,希望他们公用一份内存。未来某个变量被修改时,再为其申请一份内存空间,这个操作名为写时复制。

<?php
    $foo = 1;
    xdebug_debug_zval('foo');
    $bar = $foo;
    xdebug_debug_zval('foo');
    $bar = 2;
    xdebug_debug_zval('foo');
?>
//-----执行结果-----
foo: (refcount=1, is_ref=0)=1
foo: (refcount=2, is_ref=0)=1
foo: (refcount=1, is_ref=0)=1

分解来看:

1.第一个debug输出,定义foo变量,在内存开辟一块空间,foo变量指向那块空间;

2.第二个debug输出,将foo赋给bar变量。注意此处并不为bar申请新空间,而是将bar指向最开始开辟的那块空间。即此时foo和bar同时指向同一块空间;

3.第三个debug输出,由于bar的值为修改,所以为bar申请一块新的内存空间。

注意引用

显示引用会破坏写时复制,举个例子:

<?php
$foo['love'] = 1;
$bar  = &$foo['love'];
$tipi = $foo;
$tipi['love'] = '2';
echo $foo['love'];

最后输出结果为2。因为bar的引用,使foo[‘love’]变成了引用,从而使Zend没有对tipi的修改产生内存的复制分离。

参考资料

写时复制(Copy On Write)

发表评论

电子邮件地址不会被公开。 必填项已用*标注