免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: zvxcv
打印 上一主题 下一主题

PHP数组赋值是不是“写时拷贝”? [复制链接]

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
21 [报告]
发表于 2006-12-26 14:13 |只看该作者
原帖由 james.liu 于 2006-12-26 13:30 发表



你把它们都初始化,然后f11看。。


  我发现你钻牛角尖了。

  在$b=$a的过程之中,是不会为$b产生新的数据空间的,他此时与$a使用相同的数据空间。

  在此之后,如果$a、$b都没有做任何改变,他们两者共用一份数据空间。

  如果,(写)改变了$a或者$b的数据成员或者数据内容,那么$a、$b将使用各自独立的数据空间。

  $a将使用自己原始的数据空间,而$b,则会使用新开辟的数据空间,而这个空间将使用$a的原始($a或者$b改变之前)数据空间的内容的拷贝,然后做对应的改变。

  

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
22 [报告]
发表于 2006-12-26 14:17 |只看该作者
一种是完全拷贝(Clone/Full Copy/Split Mirror),它会创建当前原始数据(Original Data)的全部拷贝;而另外一种就是写时才拷贝(Copy on Write/Differential Copy),它只创建将要被更新的原始数据的拷贝。因此写拷贝创建映射拷贝速度快,但是恢复数据时需要使用原始数据。

论坛徽章:
0
23 [报告]
发表于 2006-12-26 14:20 |只看该作者
教学相长

论坛徽章:
0
24 [报告]
发表于 2006-12-26 14:29 |只看该作者
原帖由 showsa 于 2006-12-26 14:03 发表
初始化又如何?不知道你向说明什么问题

这是是5.1版本之前的bug

Reproduce code:
---------------
<?php

$arr = array(1,2,3);
$arr["foo"] = array(4,5,6);
$copy = $arr;

unset($ ...



先说系统的,说的不对请指正。
   系统的文件操作其实操作的是文件句柄,也就是file handle.通过对它的控制来达到对它指向的文件操作。
   有点类似c的指针,它本身其实存放的是数据空间的地址。 通过对它的使用来完成数据的读取,修改,删除。
   
   这样的好处在于速度快,因为没有直接操作数据,而只是操作指向数据的指针。另外也利于文件的存储管理。

现在说php
   $a = 12;  php在内存区域开一个满足int大小的数据空间来存放12这个数值。
   
  $b=$a; 判断a,b类型,根据a的类型开辟数据空间,存放和a一样的数值。

  之后对$b的操作,,就是判断其类型和数据空间是否存在,然后就是对数值的操作。<color=red>结构之前做过了,就不再作了</red>


之前的引用只是我以为他问php如何完成类似操作。

你举的例子是说明结构如何产生?

论坛徽章:
0
25 [报告]
发表于 2006-12-26 14:36 |只看该作者
原帖由 HonestQiao 于 2006-12-26 14:13 发表


  我发现你钻牛角尖了。

  在$b=$a的过程之中,是不会为$b产生新的数据空间的,他此时与$a使用相同的数据空间。

  在此之后,如果$a、$b都没有做任何改变,他们两者共用一份数据空间。

  如 ...



      看来我错了。这样可以节省空间的。如果直接创建就浪费了。

论坛徽章:
0
26 [报告]
发表于 2006-12-26 14:47 |只看该作者
哈哈,,刚才开zend,想起我一直很节约的用变量。。。

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
27 [报告]
发表于 2006-12-26 14:52 |只看该作者
原帖由 james.liu 于 2006-12-26 14:47 发表
哈哈,,刚才开zend,想起我一直很节约的用变量。。。


  不用那么节约,只要不是刻意的就成。

论坛徽章:
0
28 [报告]
发表于 2006-12-26 15:21 |只看该作者
c:\>php -r "$a=array(\"ddddd\"); $b=$a[0]; debug_zval_dump($a);"
array(1) refcount(2){
  [0]=>
  string(5) "ddddd" refcount(2)
}



我也测试了一下乔版主贴出的这个函数:debug_zval_dump

注意这个函数显示出变量的引用计数,要考虑调用这个函数时的“参数传递”,参数传递占用了一个引用计数

论坛徽章:
0
29 [报告]
发表于 2006-12-26 21:28 |只看该作者
copy-on-write 发扬光大有10几年了,php没理由不这样做

至于引用计数,可能涉及到GC,就不清楚了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP