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.csdn.net/qq_35770969/article/details/80757959

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章