Pertanyaan Php dilewatkan berdasarkan nilai atau dengan referensi


Sebagai pemahaman saya, ketika saya melewati array berdasarkan nilai, salinan array dibuat. yaitu di bawah program $ y & $ z harus memerlukan memori yang sama dengan $ x. Namun penggunaan memori hampir tidak meningkat. Jelas pemahaman saya salah, Adakah yang bisa menjelaskan alasannya.

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

}

5
2017-08-16 13:03


asal


Jawaban:


Saya mendengar bahwa php menggunakan copy-on-write: http://en.wikipedia.org/wiki/Copy-on-write

sebagai contoh:

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

?>

dan perilaku serupa dengan panggilan fungsi:

<?
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: Saya menguji ini di windows, mungkin itu berbeda di linux


3
2017-08-16 13:11