2012-08-16 104 views
5

据我所知,当我通过值传递数组,创建一个数组的副本。 即在下面的程序$ y & $ z应该需要与$ x相同的内存。但内存利用率几乎没有增加 显然我的理解是错误的,任何人都可以解释原因。Php通过值传递或通过引用

for($i=0;$i<1000000;$i++) 

     $x[] = $i; // memory usage : 76519792 


echo memory_get_usage(); 

function abc($y){ 

    $y[1] = 1; //memory usage : 76519948 
    $z[]= $y; //memory usage : 76520308 

} 
+3

我相信php实际上不会*复制*数据,除非你修改任何一个实例。 – 2012-08-16 13:06:58

回答

3

听说PHP使用写入时复制: http://en.wikipedia.org/wiki/Copy-on-write

为例:

<? 
for($i=0;$i<100000;$i++) 
    $x[] = $i; 

// we output the memory use: 
echo memory_get_usage().'<br/>'; // outputs 14521040 

// here we equate $y to $x, but instead of creating a copy, 
// php engine just creates a pointer to the same memory space 
$y = $x; 

echo memory_get_usage().'<br/>'; // outputs 14521128 

// here we change something in y, now php engine 
// "creates a seperate copy" for y and makes the change 
$y[1]=8; 

echo memory_get_usage().'<br/>'; // outputs 23569904 

?> 

和类似与功能的行为称之为:

<? 
for($i=0;$i<100000;$i++) 
    $x[] = $i; 

echo memory_get_usage().'<br/>'; /* 14524968 */ 

function abc($y){ 
    echo memory_get_usage().'<br/>'; /* 14524968 */ 
    $y[1] = 1; 
    echo memory_get_usage().'<br/>'; /* 23573752 */ 
    $z[]= $y; 
    echo memory_get_usage().'<br/>'; /* 23574040 */ 

} 
abc($x); 
echo memory_get_usage().'<br/>'; /* 14524968 */ 
?> 

PS:我正在测试这个在Windows上,也许它是不同的Linux

+2

试试看,因为这是正确的答案。尽管如此,你应该更好地制定。 – deceze 2012-08-16 13:12:15

+0

检查行$ y [1] = $ y; 仍然内存增加很难 – chicharito 2012-08-16 13:12:22

+0

@chicharito Zend引擎比你想象的WRT内存更智能。你只修改那里的单个数据,所以真的没有太多的事情要做。 – deceze 2012-08-16 13:16:40