摘要:前面寫過一篇底層分析關于寫時復制今天來講講關于強制分裂的知識,簡單來說,強制分裂就是在引用變量主動賦值前,該變量傳值賦值過,就會發生強制分裂。實際開發基本用不到這層原理,但在面試中強制分裂通常會和寫時復制一起考。
學習需要知其然而知其所以然,PHP底層相關就是這類知識。
前面寫過一篇《PHP底層分析:關于寫時復制(cow)》:https://segmentfault.com/a/1190000004926603
今天來講講關于強制分裂的知識,簡單來說,強制分裂就是”在引用變量主動賦值前,該變量傳值賦值過,就會發生強制分裂。”
話說起來比較繞,看下代碼解析吧。
看下面的代碼:
稍微熟悉 PHP:&引用符號都應該可以看出,output分別為gzchen,傍晚八點半,gzchen。
那么我們來看看以上代碼的底層運行流程吧。
眾所周知,一個變量就是一個結構體,長成下面這樣:
每一行都寫了注釋,此文件在zend.h在PHP源碼Zend的目錄下。
當代碼運行到line:3[$name = ‘傍晚八點半’]的時候,內存中的結構體長這樣:
當代碼運行到line:4[$myName = $name]的時候,結構體變成這樣:
運行到line:5[$nameCopy = &$name]和line:[$nameCopy = ‘gzchen’],是這樣:
△△△此處,此處,就是此處發生了強制分裂。
當is_ref__gc[引用屬性]從0->1,如果refcont_gc>1,那么就會發生強制分裂。偽代碼就是:
這個就是強制分裂。原本已經經過傳值賦值的變量,再次引用賦值出去。被傳值賦值的變量就會被分裂出一個結構體,在這里是$myName。
實際開發基本用不到這層原理,但在面試中強制分裂通常會和寫時復制(cow)一起考。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/21516.html
摘要:中基礎中的三大坑,遍歷,引用機制,數組。今天我們在講講中的一些奇怪現象。本文適合有一定基礎的。運行流程共用一個結構體開始遍歷數組,進行判斷,拷貝數組是一個新的結構體,操作的是新的結構體。那么遍歷數組時,全程與原數組無關。 PHP中基礎中的三大坑,foreach遍歷,引用機制&,數組。 今天我們在講講foreach中的一些奇怪現象。 在講解之前,可以先看看我其他相關的文章,屬于同一個大的...
摘要:可以看到,該結構體存儲了關于變量值,有幾個變量指向該結構體,變量類型,是否為引用變量等信息。這個就是寫時復制,在作怪,他沒有在賦值的時候就分裂成兩個結構體,而是在我們改寫其中一個變量時發生效果,屬于一種慢復制也稱慢分裂。 想要走到技術的天花板,那么學習過程中在于知其然且知其所以然。 今天我們來討論一下PHP底層的寫時復制(也稱寫時分裂)。 首先我們先來看看一段代碼:showImg(ht...
摘要:從外因的角度來說,系統應該能夠容忍黑客攻擊受托人作弊的情況。這里的黑客攻擊不是說,造成的后果最多是部分服務器宕機,我們已經歸到內因里去了,這里的黑客攻擊主要是指通過入侵拿到部分受托人密鑰并獲取權限,然后利用這些權限獲利。 0 前言 我曾分析了DPOS算法的漏洞并且模擬了一個簡單的攻擊的方法,然后實現了一個簡化的PBFT算法模型試圖去修復該漏洞,并且對比了效果。 隨后在正式的產品中實現了...
閱讀 2346·2021-11-24 09:39
閱讀 3790·2021-11-19 09:40
閱讀 2161·2021-09-27 13:36
閱讀 1903·2019-08-30 15:44
閱讀 401·2019-08-30 13:52
閱讀 2717·2019-08-30 11:13
閱讀 2195·2019-08-29 16:18
閱讀 1767·2019-08-29 15:43