2012-08-16 16 views
5

Come ho capito, quando ho passato array per valore, viene creata una copia dell'array. i.e nel programma in basso $ y & $ z dovrebbe richiedere la stessa memoria di $ x. tuttavia l'utilizzo della memoria difficilmente aumenta. Ovvio che la mia comprensione è sbagliata, qualcuno può spiegare la ragione.Php passato per valore o per riferimento

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

Credo che php in realtà non * copi * i dati a meno che non si modifichi l'istanza. –

risposta

3

Ho sentito che php utilizza copy-on-write: http://en.wikipedia.org/wiki/Copy-on-write

come esempio:

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

?> 

e simile comportamento con la funzione di chiamate:

<? 
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: sto testando questo su Windows, forse è diverso su Linux

+2

Tentativo upvote, perché è la risposta giusta. Dovresti comunque formulare meglio. – deceze

+0

linea di controllo $ y [1] = $ y; memoria ancora aumentata a fatica – chicharito

+0

@chicharito Il motore Zend è più intelligente di quanto pensi la memoria WRT. Stai solo modificando un singolo dato lì, quindi non c'è molto da fare davvero. – deceze

Problemi correlati