2012-08-16 106 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