Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP写时复制过程_Php - Fatal编程技术网

PHP写时复制过程

PHP写时复制过程,php,Php,据说PHP使用写时复制过程。如果我运行这些代码,我就会走神: $first = 5; $second = $first; $first = 5; 那么它是否为$first分配了新的内存空间?非常感谢运行此脚本两次。 第一次: echo "<pre>"; $first = 5; echo memory_get_usage() . "\n"; $second = $first; echo memory_get_usage() . "\n"; $first = 5; echo memor

据说PHP使用写时复制过程。如果我运行这些代码,我就会走神:

$first = 5;
$second = $first;
$first = 5;
那么它是否为$first分配了新的内存空间?非常感谢运行此脚本两次。 第一次:

echo "<pre>";
$first = 5;
echo memory_get_usage() . "\n";
$second = $first;
echo memory_get_usage() . "\n";
$first = 5;
echo memory_get_usage() . "\n";
333112
333112
333112
第二次-只评论一行

答:是的,它分配新内存

语义是“写入时复制”,而不是“仅当值发生变化时才写入时复制”

另外,一旦您声明$second,就会为它创建一些空间。该变量存在所需的最小空间。此时,不会为$first的值分配空间。因此,在这里,“写在纸上”起作用;没有写操作,因此没有为分配给$first的值分配额外的空间,该值现在被分配给$second

然后,当您将其他内容分配给$first时,会将更多的空间分配给$second。此时,创建的空间将以$first格式保存原始值的副本

echo "<pre>";
$first = 5;
echo memory_get_usage() . "\n";
//$second = $first;
echo memory_get_usage() . "\n";
$first = 5;
echo memory_get_usage() . "\n";
333112
333112
333112
<?php
    echo "<pre>";
    // 10 sets == 100 chars
    $first = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
    echo memory_get_usage() . "\n";
    $second = $first;
    echo memory_get_usage() . "\n";
    $first = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
    echo memory_get_usage() . "\n";
    $first = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
    echo memory_get_usage() . "\n";    
241496
241584
241752
241752