PHP7内核学习笔记 - zval中的知识点

2024-01-31 09:32

本文主要是介绍PHP7内核学习笔记 - zval中的知识点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • PHP5中的zval结构
struct _zval_struct {union {long lval;double dval;struct {char *val;int len;} str;HashTable *ht;zend_object_value obj;zend_ast *ast;} value;zend_uint refcount__gc;zend_uchar type;zend_uchar is_ref__gc;
};
  • PHP7中的zval结构
struct _zval_struct {union {zend_long         lval;             /* long value */double            dval;             /* double value */zend_refcounted  *counted;zend_string      *str;zend_array       *arr;zend_object      *obj;zend_resource    *res;zend_reference   *ref;zend_ast_ref     *ast;zval             *zv;void             *ptr;zend_class_entry *ce;zend_function    *func;struct {uint32_t w1;uint32_t w2;} ww;} value;union {struct {ZEND_ENDIAN_LOHI_4(zend_uchar    type,         /* active type */zend_uchar    type_flags,zend_uchar    const_flags,zend_uchar    reserved)     /* call info for EX(This) */} v;uint32_t type_info;} u1;union {uint32_t     var_flags;uint32_t     next;                 /* hash collision chain */uint32_t     cache_slot;           /* literal cache slot */uint32_t     lineno;               /* line number (for ast nodes) */uint32_t     num_args;             /* arguments number for EX(This) */uint32_t     fe_pos;               /* foreach position */uint32_t     fe_iter_idx;          /* foreach iterator index */} u2;
};
  • GC机制:仅支持数组和对象(IS_TYPE_COLLECTABLE)
  • 第一步将紫色标记为灰色,并将计数引用减1
  • 第二步仅操作灰色。若计数引用大于0,则说明非垃圾,标为黑色,并将计数引用加1(第一步中做了减1操作)。若计数引用等于0,则说明是垃圾,标为白色。
  • 移除黑色(非垃圾,不需要处理),保留白色(垃圾,需要回收)。将白色的计数引用加1,然后将处理后的roots链表移动到待释放列表(to_free
  • 释放to_free
  • 计数引用和写时复制
  • 计数引用说白了就是用来标记一个变量所指向的值被使用了多少次
  • 简单类型的变量(true/false/double/long/null)不需要引用计数
  • 临时字符串会用到引用计数。但如果变量是字符常量,则不会用到
  • 对象、资源和引用在赋值时一定会用到引用计数
  • 普通数组在赋值时也会用到引用计数,但是变量是IS_ARRAY_IMMUTABLE时,赋值不使用引用计数
  • 一个zval是否支持引用计数是通过zval.u1.type_flag来标识的。当type_flag的第三位被标记为1(IS_TYPE_REFCOUNTED标识),则代表可以引用计数。
  • 写时复制这种机制是用于节省资源的。当变量只是复制后用来展示而不做改变,那么新老变量指向的都是同一个值。当新老变量有任何一方作出变动,都会触发写时复制的机制,使得两者脱离,分别指向自己私有的值了(这时候不再共用)。
  • 变量的作用域
  • 局部变量
  • 全局变量
  • 对于复制的支持(IS_TYPE_COPYABLE)
  • 需要查找IS_TYPE_COPYABLE,除了对象和资源,其他都支持。意味着对象和资源在赋值操作之后,新的变量和老的变量指向的是同一个对象(资源)。而其他的变量类型则支持赋值(整型和浮点型会直接生成一份新的,不需要计数引用和写时复制)。
  • 只有stringarray支持复制
  • 对于引用计数的支持(IS_TYPE_REFCOUNTED)
  • 支持技术引用的类型有:stringarrayobjectresourcerefrence

这篇关于PHP7内核学习笔记 - zval中的知识点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/663297

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学