PHP写时复制

发布时间 2020年3月9日 • 1 分钟 读完 • 64 字
分享链接

PHP 写时复制,Copy On Write 简写 COW,中文意思即:写时复制

PHP 写时复制

Copy On Write 简写 COW,中文意思即:写时复制

  1. 当一个变量赋值给另外一个变量时,此时内存开销会是*2吗?
  2. 当再调用一个函数传递一个很大实参数组时,你有没有考虑过,内存的开销是怎样的!

如果针对这两个问题,你可以毫无疑问的准确回答出来,那么接下来你可以不用再看了。

案例

代码:

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时会被销毁;


评论

关注我

我的工作是编码和发布开发者表情包