PHP写时复制
发布时间 2020年3月9日 • 1 分钟 读完 • 64 字PHP 写时复制,Copy On Write 简写 COW,中文意思即:写时复制
Copy On Write 简写 COW,中文意思即:写时复制
如果针对这两个问题,你可以毫无疑问的准确回答出来,那么接下来你可以不用再看了。
代码:
echo 'init memory: ' . memory_get_usage() . '<br>';
$str = array_fill(0, 1024, 'hi');
echo 'fill after: ' . memory_get_usage() . "<br>";
$newStr = $str;
echo 'copy after: ' . memory_get_usage() . "<br>";
die;结果:
init memory: 354296
fill after: 391216
copy after: 391216可以看到重新赋值给新的变量$newStr后内存并没有增长。
多个相同值的变量共用同一块内存的确节省了内存空间,但变量的值是会发生变化的,如果在上面的例子中, 指向同一内存的值发生了变化(或者可能发生变化),就需要将变化的值“分离”出去,这个“分离”的操作, 就是“复制”。
在PHP中,Zend引擎为了区别同一个zval地址是否被多个变量共享,引入了ref_count和is_ref两个变量进行标识:
ref_count和is_ref是定义于zval结构体中
is_ref标识是不是用户使用 & 的强制引用;
ref_count是引用计数,用于标识此zval被多少个变量引用,即COW的自动引用,为0时会被销毁;