Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1627234
  • 博文数量: 1481
  • 博客积分: 26784
  • 博客等级: 上将
  • 技术积分: 17045
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-12 09:22
文章分类

全部博文(1481)

文章存档

2014年(10)

2013年(353)

2012年(700)

2011年(418)

分类: 系统运维

2012-06-11 11:35:09

/*-------------------------------- 复合类型中的COW ----------------------------------------------- */
//-- 复合类型中的COW(copy on write)《仅供参考,不对之处还望提出,谢谢!》
//本文参考而写
//如果需要测试本代码,需要安装Xdebug.
//Xdebug可以参考文章http://hi.baidu.com/meimengxuer/blog/item/021bf725eb52661a918f9dc3.html

/*
* 之前我曾经说过变量之间的COW的区别
* 下面把自己在复合类型中的COW所理解的给大家分享下
*
* 由于变量的值存储时候都是存储在zval结构中,为了节约内存于是引入了COW,当变量复制的时候就好比是中学copy试卷答案一样,两个人一起看
* 但是由于其中一个想在答案卷做标记时另一个人不愿意,此时必须在复制一份考卷答案即相当于变量值改变了产生复制一个zval存储结构一样的效果。这就是COW
*
* 对于数组来说,假如有100个元素总共大小为10k的数组,你去复制数组并且改变其中一个,根据上面所说,按理说内存中此时应该多了10k,但是事实上
* 并不是这样的,还是节约资源考虑即数组每个成员都可以看做一个zval即数组本身加上本身的100个成员可以看做101个zval结构,当改变其中一个时候
* 紧紧去复制该zval就可以了,这就是为什么内存中不会多10k大小的原因了,
*
*
*/
//-------------------------看看下面这个例子----------------- //
/**
* $foo ['love'] = 1;
* $bar = &$foo['love'];
* $tipi = $foo;
* $tipi['love'] = '2';
* echo $foo['love'];
*
* 一开始如果不去接触COW可能很多人都会认为输出值为 1 但是令你们失望了值输出为 2
* -------来分析下--------
*
* 看似$foo 与 $tipi 没有任何联系但是,$bar = &$foo['love'],数组中每个成员都会生成一个zval结构,导致'love'结构里面 is_ref 变为1
* 即标记为引用,导致 $tipi = $foo 时候$tipi数组中的'love'中is_ref 值也是为1即,改变$tipi['love']时候$foo['love']也会改变,所以
* 呈现出的结果是2。
* 从下面打印的结果中看,'love'所对应的is_ref都为1。即表明此时的zval结构是处于引用状态,结论可以得出了。
*/
$foo ['love'] = 1;
//xdebug_debug_zval('foo');
$bar = &$foo['love'];
//xdebug_debug_zval('bar');

$tipi = $foo;
$tipi['love'] = '2';
echo "
";
//echo $foo['love'];
//xdebug_debug_zval('tipi');
/*--------------------------------------------------------- */

/*
*打印结果如下:
foo:
(refcount=1, is_ref=0),
array
'love' => (refcount=1, is_ref=0),int 1

bar:
(refcount=2, is_ref=1),int 1


tipi:
(refcount=1, is_ref=0),
array
'love' => (refcount=3, is_ref=1),string '2' (length=1)

*/

原文地址:

阅读(306) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~