197 php COW机制详解和引用变量

写时复制(Copy-on-Write,也缩写为COW),顾名思义,就是在写入时才真正复制一份内存进行修改。 COW最早应用在*nix系统中对线程与内存使用的优化,后面广泛的被使用在各种编程语言中,如C++的STL等。 在PHP内核中,COW也是主要的内存优化手段。 在前面关于变量和内存的讨论中,引用计数对变量的销毁与回收中起着至关重要的标识作用。 引用计数存在的意义,就是为了使得COW可以正常运作,从而实现对内存的优化使用。

例子1:

<?php
    
    $a = range(0,9);
    var_dump(memory_get_usage());
    echo '<br />';
    $b = $a;
    var_dump(memory_get_usage());
    echo '<br />';
    $a = range(0,9);
    var_dump(memory_get_usage());
    echo '<br />';

看一下这个内存使用情况:

int(136104)
int(136152)
int(137104)

你仔细看,是不是最后一个比第一个大很多,第一个和第二个是不是差不多!这证明在内存中又开辟了一块空间;

例子2:

<?php
    $a = range(0,9);
    var_dump(memory_get_usage());
    echo '<br />';
    $b = &$a;
    var_dump(memory_get_usage());
    echo '<br />';
    $a = range(0,9);
    var_dump(memory_get_usage());
    echo '<br />';

看一下这个内存使用情况:

int(136104)
int(136152)
int(136152)

你再仔细看,下面是不是一样了,这就是引用的作用,不会开辟内存空间了,$a和$b共用一块内存空间!

下面是xdebug出来的信息:

<?php
$a = range(0,2);
xdebug_debug_zval('a');
echo '<br />';
$b = &$a;
xdebug_debug_zval('a');
echo '<br />';
$a = range(0,2);
xdebug_debug_zval('a');
a:
(refcount=1, is_ref=0),
array (size=3)
  0 => (refcount=1, is_ref=0),int 0
  1 => (refcount=1, is_ref=0),int 1
  2 => (refcount=1, is_ref=0),int 2

a:
(refcount=2, is_ref=1),
array (size=3)
  0 => (refcount=1, is_ref=0),int 0
  1 => (refcount=1, is_ref=0),int 1
  2 => (refcount=1, is_ref=0),int 2

a:
(refcount=2, is_ref=1),
array (size=3)
  0 => (refcount=1, is_ref=0),int 0
  1 => (refcount=1, is_ref=0),int 1
  2 => (refcount=1, is_ref=0),int 2

 

refcount 指向该空间的变量数,is_ref是不是引用

对比下面不是引用变量的

a:
(refcount=1, is_ref=0),
array (size=3)
  0 => (refcount=1, is_ref=0),int 0
  1 => (refcount=1, is_ref=0),int 1
  2 => (refcount=1, is_ref=0),int 2

a:
(refcount=2, is_ref=0),
array (size=3)
  0 => (refcount=1, is_ref=0),int 0
  1 => (refcount=1, is_ref=0),int 1
  2 => (refcount=1, is_ref=0),int 2

a:
(refcount=1, is_ref=0),
array (size=3)
  0 => (refcount=1, is_ref=0),int 0
  1 => (refcount=1, is_ref=0),int 1
  2 => (refcount=1, is_ref=0),int 2

安装xdebug,https://blog.youkuaiyun.com/qq_35770969/article/details/80757959

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

phpstory

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值