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