2012-08-16 21 views
5

Según entiendo, cuando pasé array por valor, se creó una copia de la matriz. es decir, en el programa siguiente $ y & $ z debería necesitar la misma memoria a partir de $ x. sin embargo, la utilización de la memoria apenas aumenta. Obviamente mi comprensión es incorrecta, ¿Alguien puede explicar el motivo?Php pasado por valor o por referencia

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

Creo que php en realidad no * copia * datos a menos que modifique cualquiera de las instancias. –

Respuesta

3

oí que PHP utiliza copia en escritura: http://en.wikipedia.org/wiki/Copy-on-write

como ejemplo:

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

?> 

y comportamiento similar con las llamadas de función:

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

PD: estoy probando esto en Windows, tal vez sea diferente en Linux

+2

Voto ascendente provisional porque es la respuesta correcta. Deberías formular eso mejor sin embargo. – deceze

+0

línea de verificación $ y [1] = $ y; aún la memoria aumentó apenas – chicharito

+0

@chicharito El motor Zend es más inteligente de lo que piensa en la memoria WRT. Solo está modificando una sola pieza de datos, por lo que no hay mucho que hacer realmente. – deceze

Cuestiones relacionadas