PHP - 引用计数
引用计数以及是否是引用变量,一个神奇的函数,查看当前引用计数:
<?php
xdebug_debug_zval('a');
以上例程会输出:
a: (refcount=1, is_ref=0)='new string' 下面进入正式环节:
<?php
$a = "new string";
$b = $a;
xdebug_debug_zval( 'a' );
?>
输出: a: (refcount=2, is_ref=0)='new string'
也就是说当你把一个变量赋值给另外一个变量的时候,实际上并没有复制容器,而是引用赋值。当你真正需要修改的时候,才会复制这个容器。当refcount=0的时候,这个容器也就被删除了,每次unset操作把容器的refcount值减少1。
类似的,数组和对象也是这个工作原理,他们只不过是一个符合的容器,但是这样
<?php
$a = array( 'one' );
$a[] =& $a;
xdebug_debug_zval( 'a' );
?>
a: (refcount=2, is_ref=1)=array (
0 => (refcount=1, is_ref=0)='one',
1 => (refcount=2, is_ref=1)=...
)
注意到,这里赋值的时候使用了&,否则只是产生一个复合容器的复制品而已。
这个时候,$a的一个元素竟然指向了本身,这样就产生了循环引用,也就是说如果我们使用unset($a)之后,就没有任何引用指向这个复合容器了,但是它的引用计数仍然是1,而且是一个没有任何办法可以引用到的闭包变量。
对于,正常的小脚本来说这不算什么,我们不过多了一个结构体存在内存中,脚本终止的时候,也就木有了。但是如果是长时间运行的脚本,如大规模的测试套件,或者是GTK+PHP编写的应用程序,那估计就废了。
引用计数系统中的同步周期回收(Concurrent Cycle Collection in Reference Counted Systems)
PHP - 引用计数的更多相关文章
- Objective-C内存管理之引用计数
初学者在学习Objective-c的时候,很容易在内存管理这一部分陷入混乱状态,很大一部分原因是没有弄清楚引用计数的原理,搞不明白对象的引用数量,这样就当然无法彻底释放对象的内存了,苹果官方文档在内存 ...
- swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- C++ 引用计数技术及智能指针的简单实现
一直以来都对智能指针一知半解,看C++Primer中也讲的不够清晰明白(大概是我功力不够吧).最近花了点时间认真看了智能指针,特地来写这篇文章. 1.智能指针是什么 简单来说,智能指针是一个类,它对普 ...
- 【Python】引用计数
一.概述 要保持追踪内存中的对象,Python使用了引用计数这一简单的技术. 二.引用计数的增减 2.1 增加引用计数 当对象被创建并(将其引用)赋值给变量时,该对象的引用计数被设置为1. 对象的引用 ...
- iOS开发--引用计数与ARC
以下是关于内存管理的学习笔记:引用计数与ARC. iOS5以前自动引用计数(ARC)是在MacOS X 10.7与iOS 5中引入一项新技术,用于代替之前的手工引用计数MRC(Manual Refer ...
- Objective-C内存管理之-引用计数
本文会继续深入学习OC内存管理,内容主要参考iOS高级编程,Objective-C基础教程,疯狂iOS讲义,是我学习内存管理的笔记 内存管理 1 内存管理的基本概念 1.1 Objective-C中的 ...
- 第3月第2天 find symbolicatecrash 生产者-消费者 ice 引用计数
1.linux find export find /Applications/Xcode.app/ -name symbolicatecrash -type f export DEVELOPER_DI ...
- swif-自动引用计数
import UIKit /* class Person { let name: String //强引用 init(name: String) { self.name = name print(&q ...
- OC中的自动引用计数
目录: 1,自动引用计数的定义 2,强引用和弱引用 3,类比手动引用 4,循环引用 5,CoreFoundation 内容: 自动引用计数的定义: (Automatic Reference Count ...
- ATL是如何实现线程安全的引用计数和多线程控制的
ATL是如何实现线程安全的引用计数和多线程控制的 正如标题所示,这是我经常被问到的一个问题,而每次我都从头开始给人说一次,其实说来过程理解起来的确有点复杂. 我们的每一个ATL Server Obje ...
随机推荐
- cmd连接mysql操作命令
连接:mysql -h主机地址 -u用户名 -p用户密码 (注:u与root可以不用加空格,其它也一样)断开:exit (回车) 创建授权:grant select on 数据库.* to 用户名@登 ...
- drone 学习四 几个有用的命令
1. 安装cli 工具 linux curl -L https://github.com/drone/drone-cli/releases/download/v0.8.5/drone_linux_am ...
- yum命令集
升级相关命令: yum update : 安装所有更新软件 yum update xxx : 仅更新指定的软件 yum check-update : 列出所有可更新的软件清单 yum list : 列 ...
- 试玩swoole扩展 第一天
安装 pecl install swoole 部分过程: configure: creating ./config.statusconfig.status: creating config.hrunn ...
- 最近github上的一些有用链接资料备份
https://github.com/dlunion 这个人写了库里面有caffe简单版本的代码,依赖少的版本,他的caffe可以支持ssd和lstm序列识别等等 还有openPose等库代码 OCR ...
- sourceTree 添加 ssh key 方法【转】
1.使用 git 客户的生成公私钥:id_rsa.id_rsa.pub 1.1设置Git的user name和email: $ git config --global user.name " ...
- oracle版本及字符集查询
查询oracle版本:select * from v$version; 查询oracle字符集:select * from nls_database_parameters;
- struts2学习(4)struts2核心知识III
一.result配置: result - name 就是前面返回的值,success,error等. type: dispatcher. 默认是这个,底层是jsp的forward: redirect: ...
- 杂项:Hadoop
ylbtech-杂项:Hadoop Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储.Ha ...
- vue 跟路径加载缺少跟前缀
vue 加载资源失败:跟路径残缺,都是配置时 一个正斜杠 / 多余惹的祸