PHP源码分析(基本变量、垃圾回收)

本文深入分析了PHP的zval结构,包括其在PHP7中的优化,如栈上分配临时变量。探讨了Zend_string、Zend_array、引用类型和垃圾回收机制,特别是循环引用造成的内存泄漏问题,以及PHP7如何处理这类问题以避免内存泄漏。
摘要由CSDN通过智能技术生成

小而巧的zval

扩充:

结构体: 比如 

              struct test  {  char a //1  int b//4 long c //8  } 

               总共占了2*8=16字节 

              因为结构体对齐,虽然浪费字节,但是得益于内存对齐,存取速度会更快

联合体:比如 union{

              char a; //1   int b;4 long c ; //8

             }

           结果:(gdb) p sizeof(union test)   $1=8 

          它复用了同一块内存,a、b和c公用同一块内存,修改a,也会修改b和c的值,同时可以知道联合体的大小为其最大成员的大小

栈区:存储参数值、局部变量,维护函数调用关系,栈的变量是局部的,随着局部空间的销毁而销毁,由系统负责

堆区:动态内存区域,随时申请和释放,程序自身要对内存泄露负责,堆上面的变量可以提供全局访问,需要自行处理其生命周期

 

  zval可以表示PHP中任意一个变量

struct_zval_struct{
   zend_value  value;
   union  u1;
   union  u2;
}


typedef union_zend_value{
   zend_long  lval;  //整形
   double     dval;  //浮点型
   zend_refcounted *counted 
   zend_string  *str; //字符串
   zend_array   *arr; //数组 ->hashtable
   zend_object  *obj; //对象
   zend_resource *res; //资源类型
   zend_reference *ref; //引用类型
   zend_ast_ref   *ast; //抽象语法树
   zval  *zv;  //还可以指向一个zval
   void  *ptr; //不确定类型
   zend_class_entry *ce;//类
   zend_function  *func;

}zend_value;

源码图:文件zand_types.h

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值