写时复制(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.csdn.net/qq_35770969/article/details/80757959