Home  >  Article  >  Backend Development  >  关于php中数组和内存的管理

关于php中数组和内存的管理

WBOY
WBOYOriginal
2016-06-23 13:59:48917browse

按手册上说的,php除了object外,其他类型的变量在赋值、参数传递、返回值中得到都是它的副本
但是看下面的测试,不知道是因为测试方法有问题,还是说如果没有用&按引用传递的时候还是共享同一部分内存,但是在改变它的元素以后才真正生成了一份副本出来?




回复讨论(解决方案)

不是很清楚你的目标是什么?

m = 0;$m = memory_get_usage();$t = array('id' => 1, 'name' => 'none');echo '$t 占用: ', memory_get_usage() - $m, PHP_EOL;$data = array();echo '空的 $data 占用: ', memory_get_usage() - $m, PHP_EOL;$m = memory_get_usage();for($i=0; $i<1000; $i++) {  $data[] = null;}echo '1000 个空元素的 $data 占用: ', memory_get_usage() - $m, PHP_EOL;$data = array();$m = memory_get_usage();for($i=0; $i<1000; $i++) {  $data[] = $t;}echo '1000 个$t元素的 $data 占用: ', memory_get_usage() - $m, PHP_EOL;$data = array();$m = memory_get_usage();for($i=0; $i<1000; $i++) {  $data[] = array('id' => 1, 'name' => 'none');}echo '1000 个实体元素的 $data 占用: ', memory_get_usage() - $m, PHP_EOL;
$t 占用: 360
空的 $data 占用: 496
1000 个空元素的 $data 占用: 84200
1000 个$t元素的 $data 占用: 52104
1000 个实体元素的 $data 占用: 356136

这样可能清楚些

其实就是想知道在参数传递或者返回体积很大的数组的时候,有必要以引用传递来提升性能吗

当然那是表面现象,我是想了解下php是如何管理内存的,有没有官方的资料啥的,要不只能看php的source了?

想了解 php 是如何管理内存的,当然是看源代码最好了
网上也有些相关文章,不多有些年头了,与现在的 php 不一定合适。毕竟 php5.3.6 起,内核一直在修改。当然速度也提升了好几个数量级

不过研究他也没有多大意义
你最多只需要知道变量是存放在一个变量表中的

当然那是表面现象,我是想了解下php是如何管理内存的,有没有官方的资料啥的,要不只能看php的source了?

哈希表

/*变量的存储结构*/struct _zval_struct {    zvalue_value value; /* 变量的值 */    zend_uint refcount__gc;    zend_uchar type;    /* 变量当前的数据类型 */    zend_uchar is_ref__gc;};typedef struct _zval_struct zval; /*变量值的存储结构*/typedef union _zvalue_value {    long lval;  /* 长整型 */    double dval;    /* 双精度浮点型 */    struct { /*字符型*/        char *val;        int len;    } str;    HashTable *ht;  /* 存放数组 用哈希表 (就是个指针) */    zend_object_value obj; /*对象*/} zvalue_value;

php的变量是写时复制的
看看这篇文章:http://www.laruence.com/2008/09/19/520.html

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn