摘要:前面写过一篇底层分析关于写时复制今天来讲讲关于强制分裂的知识,简单来说,强制分裂就是在引用变量主动赋值前,该变量传值赋值过,就会发生强制分裂。实际开发基本用不到这层原理,但在面试中强制分裂通常会和写时复制一起考。
学习需要知其然而知其所以然,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)一起考。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/21516.html
摘要:中基础中的三大坑,遍历,引用机制,数组。今天我们在讲讲中的一些奇怪现象。本文适合有一定基础的。运行流程共用一个结构体开始遍历数组,进行判断,拷贝数组是一个新的结构体,操作的是新的结构体。那么遍历数组时,全程与原数组无关。 PHP中基础中的三大坑,foreach遍历,引用机制&,数组。 今天我们在讲讲foreach中的一些奇怪现象。 在讲解之前,可以先看看我其他相关的文章,属于同一个大的...
摘要:可以看到,该结构体存储了关于变量值,有几个变量指向该结构体,变量类型,是否为引用变量等信息。这个就是写时复制,在作怪,他没有在赋值的时候就分裂成两个结构体,而是在我们改写其中一个变量时发生效果,属于一种慢复制也称慢分裂。 想要走到技术的天花板,那么学习过程中在于知其然且知其所以然。 今天我们来讨论一下PHP底层的写时复制(也称写时分裂)。 首先我们先来看看一段代码:showImg(ht...
摘要:从外因的角度来说,系统应该能够容忍黑客攻击受托人作弊的情况。这里的黑客攻击不是说,造成的后果最多是部分服务器宕机,我们已经归到内因里去了,这里的黑客攻击主要是指通过入侵拿到部分受托人密钥并获取权限,然后利用这些权限获利。 0 前言 我曾分析了DPOS算法的漏洞并且模拟了一个简单的攻击的方法,然后实现了一个简化的PBFT算法模型试图去修复该漏洞,并且对比了效果。 随后在正式的产品中实现了...
阅读 2275·2021-11-24 09:39
阅读 3744·2021-11-19 09:40
阅读 2115·2021-09-27 13:36
阅读 1850·2019-08-30 15:44
阅读 364·2019-08-30 13:52
阅读 2679·2019-08-30 11:13
阅读 2079·2019-08-29 16:18
阅读 1686·2019-08-29 15:43