2012-08-16 17 views
5

Jak rozumiem, kiedy przekazałem tablicę według wartości, tworzona jest kopia tablicy. tj. W poniższym programie $ y & $ z powinno wymagać tej samej pamięci co $ x. jednak wykorzystanie pamięci praktycznie nie wzrasta. Oczywiście, że moje zrozumienie jest złe, Czy ktoś może wyjaśnić przyczynę.Php przekazany przez wartość lub przez odniesienie

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

Wierzę, że php faktycznie nie * kopiuje * danych, chyba że zmodyfikujesz dowolną instancję. –

Odpowiedz

3

Słyszałem, że php używa kopiowanie przy zapisie: http://en.wikipedia.org/wiki/Copy-on-write

jako przykład:

<? 
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 

?> 

i podobne zachowanie z funkcją rozmowy:

<? 
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: Testuję to w systemie Windows, może to jest inne na Linuksie

+2

Wstępne przegłosowanie, ponieważ jest to właściwa odpowiedź. Powinieneś jednak sformułować to lepiej. – deceze

+0

sprawdź linię $ y [1] = $ y; pamięć wciąż prawie się nie zwiększa – chicharito

+0

@chicharito Silnik Zend jest inteligentniejszy niż myślisz o pamięci WRT. Modyfikujesz tylko jeden fragment danych, więc naprawdę nie ma zbyt wiele do zrobienia. – deceze

Powiązane problemy