php7引用计数,PHP7 引用计数 读书笔记

PHP7 引用计数 读书笔记

每个 PHP 变量存在一个加 "zval" 的变量容器中. 一个 zval 变量容器, 除了包含变量的类型和值, 还包括两个字节的额外信息.

1.is_ref : 是一个 bool 值, 用来标识这个变量是否属于引用集合. 通过这个字节, PHP 引擎才能把普通变量和引用变量区分开来, 由于 PHP 允许用户通过 & 来自定义引用, zval 变量容器中还有一个内部引用计数机制, 来优化内存使用.

2.refcount, 用来表示指向这个 zval 变量容器的变量 (也称为符号 symbol) 个数. 所有的符号存在一个符号表中, 其中每个符号都有作用域, 那些主脚本和每个函数或者方法也都有作用域.

接下来我们通过几个例子来帮助大家理解.(以下代码是在 Linux+php7.1 环境下)

1. 生成一个新的 zval 容器<?PHP

$a='new string';

xdebug_debug_zval('a');

输出结果如下:

ab7653affab982b574eb7acc55df2e04.gif

从结果可以看出 refount = 0,is_ref=0 那怎么理解这个输出结果呢?

(1)is_ref = 0 信息很容易理解,$a 不是一个引用变量自然就是 0

(2)refount 的值怎么也是 0, 因为我们知道在 php7 中对于简单的数据类型, 比如整型, 字符串, 浮点型等简单类型的值是直接存储在 zval 结构里面.

如果把变量 a 赋值给多个变量会怎样?<?PHP

$a="new string";

$c=$b=$a;

xdebug_debug_zval('a');

输出结果如下:

ab7653affab982b574eb7acc55df2e04.gif

发现 refcount 的值还是 0, 三个变量共用 1 个 zval 结构, 没有存符号表. 下面我们再给看下变量被引用后的情况:<?PHP

$a="new string";

$b=&$a;

$c=&$b;

xdebug_debug_zval('a');

xdebug_debug_zval('b');

xdebug_debug_zval('c');

输出结果如下:

ab7653affab982b574eb7acc55df2e04.gif

我们发现三个变量的 refount 和 is_ref 都相同, 那我们来解释下:

1. 当变量被引用后, 原来的 zval 结构会发生变化, PHP 会新增一个_zend_reference 结构, 这个结构会根据值得类型不同而不同.struct_zend_reference{

zend_refcounted_h gc;

zval val;

}

我们来看下 PHP 的具体操作:

(1)PHP 会申请一个 zend_reference 结构

(2)将 zval_reference.value 指向原来的 zval_struct.value

(3)zval_struct.value 的数据类型修改为 zend_refrence

(4)将 zval_struct.value 指向刚刚申请并初始化的 zend_reference

(5)为新变量申请 zval_struct 结构, 将他的 value 指向刚刚创建的 zend_reference

来源: http://www.bubuko.com/infodetail-3382348.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[vue] 说说你对slot的理解有多少?slot使用场景有哪些?

[vue] 说说你对slot的理解有多少&#xff1f;slot使用场景有哪些&#xff1f; 通过插槽可以让用户可以拓展组件&#xff0c;去更好地复用组件和对其做定制化处理如果父组件在使用到一个复用组件的时候&#xff0c;获取这个组件在不同地方有少量的更改&#xff0c;如果去重写组…

javascript原型链

概念 1 原型对象 Prototype 我们创建的每个函数都有一个 prototype&#xff08;原型&#xff09;属性&#xff0c;指向一个对象&#xff0c;而这个对象的用途是包含所有实例共享的属性和方法。这个prototype指向的对象就是调用构造函数创建的实例的原型对象。 function F () {t…

焦呼?焦矣!

焦了。做了个香蕉蛋糕。总觉得它还没熟&#xff0c;就让它没完没了地烤着。于是焦了。可里面居然还是湿润的。是蛋糕的问题&#xff0c;还是6寸模的问题&#xff0c;还只是人的问题&#xff1f;烤一半时&#xff0c;爹临出门时&#xff0c;过来往上头按了一大拇指。很好&#x…

yii 1.4 constant.php,yii 中设置提示成功信息,错误提示信息,警告信息

方法一&#xff1a;Yii::app()->user->setFlash(‘success’,”Data saved!”); 设置键值名为success的临时信息.在getFlash后删除. 可以定义多种不同的键值名对象的消息.?><?php if(Yii::app()->user->hasFlash(‘success’)):?> 消息存在里,<?ph…

[vue] 说说你对provide和inject的理解

[vue] 说说你对provide和inject的理解 通过在父组件中inject一些数据然后再所有子组件中都可以通过provide获取使用该参数,主要是为了解决一些循环组件比如tree, menu, list等, 传参困难, 并且难以管理的问题, 主要用于组件封装, 常见于一些ui组件库个人简介 我是歌谣&#x…

k倍区间

给定一个长度为N的数列&#xff0c;A1, A2, … AN&#xff0c;如果其中一段连续的子序列Ai, Ai1, … Aj(i < j)之和是K的倍数&#xff0c;我们就称这个区间[i, j]是K倍区间。 你能求出数列中总共有多少个K倍区间吗&#xff1f; 输入第一行包含两个整数N和K。(1 < N, K &l…

AJAX(2),我的第一个AJAX程序

首先&#xff0c;在VS2005中新建一个网站&#xff0c;拖入一个Button和Text,设置Button的客户端事件为userCheck(),<asp:TextBox ID"username"runat"server"></asp:TextBox><input type"button"name"check"value"…

[vue] 组件中写name选项有什么作用?

[vue] 组件中写name选项有什么作用&#xff1f; 项目使用keep-alive时&#xff0c;可搭配组件name进行缓存过滤 DOM做递归组件时需要调用自身name vue-devtools调试工具里显示的组见名称是由vue中组件name决定的个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。…

php和js序列化,PHP中serialize和json序列化与反序列化的区别

在PHP中&#xff0c;serialize和json两种方式对一个对象或数组进行序列化或反序列化有什么区别呢&#xff1f;假设一个对象和一个数组&#xff1a;PHP1234$webnewstdClass;$web->sitetantengvip;$web->ownertuntun;$web->age5;和PHP1234$webarray();$web[site]tanteng…

[导入]ASP.NET 2.0中Page事件的执行顺序

文章来源:http://blog.csdn.net/21aspnet/archive/2007/03/20/1535517.aspx 转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2007/03/21/816354.html

[Swift]LeetCode859. 亲密字符串 | Buddy Strings

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号&#xff1a;山青咏芝&#xff08;shanqingyongzhi&#xff09;➤博客园地址&#xff1a;山青咏芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;➤GitHub地址&a…

三瞬属性matlab,matlab:out of memory 1

问题三&#xff1a;Increase the size of the swap file.wap space的设置与使用的操作系统有关&#xff0c;具体的如下&#xff1a;1.UNIXInformation about swap space can be procured by typing pstat -s at the UNIX command prompt. For detailed information on changing…

[导入]C#中TextBox只能输入数字的代码

文章来源:http://blog.csdn.net/21aspnet/archive/2007/03/20/1535640.aspx 转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2007/03/21/816242.html

实验1c语言开发环境使用和数据类型、运算符和表达式

实验结论 由于这一次是第一次做实验有很多东西不熟悉 比如忘记加分号&#xff0c;用中文输入法打不对符号等等。总之经过这实验我学到了很多。#include <stdio.h> int main() {int x;printf("输入一个整数: \n");scanf("%d",&x);// 在处填写相应…

[vue] vue怎么改变插入模板的分隔符?

[vue] vue怎么改变插入模板的分隔符&#xff1f; optionMergeStrategies类型&#xff1a;{ [key: string]: Function }默认值&#xff1a;{}用法&#xff1a;Vue.config.optionMergeStrategies._my_option function (parent, child, vm) {return child 1}const Profile Vue…

php地址转换成经纬度,百度地图 获取地址转换为经纬度

html>根据地址查询经纬度a.{margin-right:100px;}style"position: absolute;margin-top:30px;width: 730px;height: 590px;top: 50px;border: 1px solid gray;overflow:hidden;">var map new BMap.Map("container");var point new BMap.Point(113.…

Nhibernate学习起步之many-to-one篇(转)

1. 学习目的: 通过进一步学习nhibernate基础知识&#xff0c;在实现单表CRUD的基础上&#xff0c;实现两表之间one-to-many的关系. 2. 开发环境必要准备 开发环境: windows 2003,Visual studio .Net 2005,Sql server 2005 developer edition 必要准备: 学习上篇文章单…

[vue] 你了解什么是函数式组件吗?

[vue] 你了解什么是函数式组件吗&#xff1f; 函数式组件&#xff1a;需要提供一个render方法&#xff0c; 接受一个参数&#xff08;createElement函数&#xff09;&#xff0c; 方法内根据业务逻辑&#xff0c;通过createElement创建vnodes&#xff0c;最后return vnodescre…

列表元素的几种统计方法总结(嵌套列表)

&#xff08;1&#xff09;列表中的count方法(速度慢) #嵌套列表类型的统计 l [[1,2,3,4,5],[1,2,3,4,5],[5,6,7,8,9]] dictionary {} s set(l) for i in s:dict[i] l.count(i)&#xff08;2&#xff09;字典&#xff08;速度慢&#xff09; l [[1,2,3,4,5],[1,2,3,4,5],[5…

SQL Server数据库优化方案

SQL Server数据库优化方案 查询速度慢的原因很多&#xff0c;常见如下几种&#xff1a;1、没有索引或者没有用到索引(这是查询慢最常见的问题&#xff0c;是程序设计的缺陷)2、I/O吞吐量小&#xff0c;形成了瓶颈效应。3、没有创建计算列导致查询不优化。4、内存不足5、网络速度…