通过引用保存值时的内存使用情况

时间:2011-07-31 10:53:39

标签: php reference

$myStr = '';
for ($i = 0; $i<999500; $i++) {
    $myStr .= chr(rand(0,127));
}
echo round(memory_get_usage()/1024/1024,2) . ' Mb';

我得到1.27 Mb

$myStr = '';
for ($i = 0; $i<999500; $i++) {
    $myStr .= chr(rand(0,127));
}
$myStr2 = &$myStr;
echo round(memory_get_usage()/1024/1024,2) . ' Mb';

我将myStr保存到myStr2参考,我得到了1.27 Mb

$myStr = '';
for ($i = 0; $i<999500; $i++) {
    $myStr .= chr(rand(0,127));
}
$myStr2 = $myStr;
echo round(memory_get_usage()/1024/1024,2) . ' Mb';

$ myStr2 = $ myStr 我有1.27 Mb 。这是怎么回事?为什么我得到1.27 Mb,而不是2.54 Mb?

2 个答案:

答案 0 :(得分:2)

PHP在写时进行复制:只要您只读取第二个变量(而不是写入它),就不会从第一个变量中复制它。

答案 1 :(得分:1)

通过将变量分配给PHP中的另一个变量,PHP将立即复制变量的数据以用于内存优化。

只有在您实际更改两个变量之一时,PHP才会复制数据,然后只更改两个变量数据中的一个:

$myStr2 = $myStr; # this won't copy the data.
$myStr2 .= 'X'; # this will trigger copy on write.

此优化称为“写入时复制”(Wikipedia)。

如果您想对该主题进行全面的科学阅读,请参阅: