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

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