今天來講講關於強制分裂的知識,簡單來說,強制分裂就是」在參照變數主動賦值前,該變數傳值賦值過,就會發生強制分裂。」
話說起來比較繞,看下程式碼解析吧。
看下面的程式碼:
稍微熟悉 PHP:&參照符號都應該可以看出,output分別為gzchen,傍晚八點半,gzchen。
那麼我們來看看以上程式碼的底層執行流程吧。
眾所周知,一個變數就是一個結構體,長成下面這樣:
每一行都寫了註釋,此檔案在zend.h在PHP原始碼Zend的目錄下。
當程式碼執行到line:3[$name = ‘傍晚八點半’]的時候,記憶體中的結構體長這樣:
當程式碼執行到line:4[name]的時候,結構體變成這樣:
執行到line:5[Misplaced &
name]和line:[$nameCopy = ‘gzchen’],是這樣:
此處,此處,就是此處發生了強制分裂。
當is_ref__gc[參照屬性]從0->1,如果refcont_gc>1,那麼就會發生強制分裂。虛擬碼就是:
這個就是強制分裂。原本已經經過傳值賦值的變數,再次參照賦值出去。被傳值賦值的變數就會被分裂出一個結構體,在這裡是$myName。
實際開發基本用不到這層原理,但在面試中強制分裂通常會和寫時複製(cow)一起考。
更多程式設計相關內容,請關注TW511.COM程式設計入門欄目!
以上就是PHP底層分析之關於強制分裂的詳細內容,更多請關注TW511.COM其它相關文章!