PHP 引用計數

2022-08-31 20:15:12 字數 1181 閱讀 6159

引用計數以及是否是引用變數,乙個神奇的函式,檢視當前引用計數:

1

<?php

2 xdebug_debug_zval('a');

以上例程會輸出:

a: (refcount=1, is_ref=0)='new string'

下面進入正式環節:

<?php

$a = "new string";

$b = $a

;xdebug_debug_zval( 'a');

?>

輸出:a: (refcount=2, is_ref=0)='new string'

也就是說當你把乙個變數賦值給另外乙個變數的時候,實際上並沒有複製容器,而是引用賦值。當你真正需要修改的時候,才會複製這個容器。當refcount=0的時候,這個容器也就被刪除了,每次unset操作把容器的refcount值減少1。
類似的,陣列和物件也是這個工作原理,他們只不過是乙個符合的容器,但是這樣

<?php

$a = array( 'one');

$a =& $a

;xdebug_debug_zval( 'a');

?>

a: (refcount=2, is_ref=1)=array (

0 => (refcount=1, is_ref=0)='one',

1 => (refcount=2, is_ref=1)=...

)

注意到,這裡賦值的時候使用了&,否則只是產生乙個復合容器的複製品而已。

這個時候,$a的乙個元素竟然指向了本身,這樣就產生了迴圈引用,也就是說如果我們使用unset($a)之後,就沒有任何引用指向這個復合容器了,但是它的引用計數仍然是1,而且是乙個沒有任何辦法可以引用到的閉包變數。

對於,正常的小指令碼來說這不算什麼,我們不過多了乙個結構體存在記憶體中,指令碼終止的時候,也就木有了。但是如果是長時間執行的指令碼,如大規模的測試套件,或者是gtk+php編寫的應用程式,那估計就廢了。

引用計數系統中的同步週期**(concurrent cycle collection in reference counted systems)

自動引用計數

每當你產生乙個物件,arc分配一大塊控制項去儲存這個物件。除此之外,當乙個物件是不在需要,arc 將會收回這個例項物件所佔的空間。如果乙個物件的空間被釋放掉,但是你任然通過物件的引用呼叫方法或者屬性,你的程式將要崩潰。為了不讓物件被釋放掉 arc將會追蹤有多少屬性 常量 變數正在引用這個物件。只要有...

引用計數 copy on write

拷貝通常分為值拷貝也叫淺拷貝和深拷貝,當拷貝方式為淺拷貝時就會有以下兩個問題 1 當需要調析構函式時,會出現同一塊空間被析構兩次的情況 2 如果是對指標的淺拷貝,會讓兩個指標同時管理同一塊空間,當乙個指針對這塊空間進行修改時,會影響到另外乙個指標。通過引用計數加寫時拷貝可以有效地解決這些問題。引用計...

自動引用計數

使用弱引用解決迴圈強引用 如果兩個變數屬性都可以設定為nil,那麼就用弱引用來設定其中乙個屬性來解決迴圈強引用。class person weak var apartment apartment?deinit class apartment deinit var aperson person?per...