解析PHP中的内存管理,PHP动态分配和释放内存(5)

八、 分离问题
尽管已经存在上面讨论到的复制和引用技术,但是还存在一些不能通过is_ref和refcount操作来解决的问题。请考虑下面这个PHP代码块:

复制代码 代码如下:


<?php
$a = 1;
$b = $a;
$c = &$a;
?>


在此,你有一个需要与三个不同的变量相关联的值。其中,两个变量是使用了"change-on-write"完全引用方式,而第三个变量处于一种可分离的"copy-on-write"(写复制)上下文中。如果仅使用is_ref和refcount来描述这种关系,有哪些值能够工作呢?
回答是:没有一个能工作。在这种情况下,这个值必须被复制到两个分离的zval*中,尽管两者都包含完全相同的数据(见图2)。

深入探讨PHP中的内存管理问题


图2.引用时强制分离


  同样,下列代码块将引起相同的冲突并且强迫该值分离出一个副本(见图3)。

深入探讨PHP中的内存管理问题


图3.复制时强制分离

复制代码 代码如下:


<?php
$a = 1;
$b = &$a;
$c = $a;
?>


注意,在这里的两种情况下,$b都与原始的zval对象相关联,因为在分离发生时引擎无法知道介于到该操作当中的第三个变量的名字。

九、 总结
PHP是一种托管语言。从普通用户角度来看,这种仔细地控制资源和内存的方式意味着更为容易地进行原型开发并导致出现更少的冲突。然而,当我们深入"内里"之后,一切的承诺似乎都不复存在,最终还要依赖于真正有责任心的开发者来维持整个运行时刻环境的一致性。

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/9ace1cccf3d82ad721342010d1d8acdc.html