gpt4 book ai didi

PHP:ref 从函数返回的值似乎在多个赋值中被复制

转载 作者:行者123 更新时间:2023-12-04 06:50:52 25 4
gpt4 key购买 nike

当 ref 从函数返回的值分配给多个变量时,第一个变量之后的赋值似乎复制了该值。

我用来测试它的代码是:

root@kelso:/tmp# php -r 'function &bar() {static $x; if (NULL === $x) {$x=range(1,99999);}; return $x;};  var_dump(memory_get_usage()); bar(); var_dump(memory_get_usage()); $b1=bar(); var_dump(memory_get_usage()); $b2=bar(); var_dump(memory_get_usage()); $b3=bar(); var_dump(memory_get_usage());'  
int(95872)
int(20345912)
int(20346040)
int(33395000)
int(46444184)

相同的代码,格式化并带有注释:
function &bar() {static $x; if (NULL === $x) {$x=range(1,99999);}; return $x;};  
var_dump(memory_get_usage()); // starting out with 95872
bar();
var_dump(memory_get_usage()); // 20345912 - first call to bar() sets the static $x
$b1=bar();
var_dump(memory_get_usage()); // 20346040 - first assignment consumes almost no memory
$b2=bar();
var_dump(memory_get_usage()); // 33395000 - second assignment seems to copy it
$b3=bar();
var_dump(memory_get_usage()); // 46444184 - third assignment seems to copy it again

是否有任何原因只有第一个赋值由 ref 返回而其他赋值被复制?

为了进行比较,当值不是从函数返回时会发生以下情况:
root@kelso:/tmp# php -r 'var_dump(memory_get_usage());; $a=range(1,99999); var_dump(memory_get_usage()); $b=&$a; var_dump(memory_get_usage()); $c=&$a; var_dump(memory_get_usage());'  
int(92224)
int(20342024)
int(20342152)
int(20342280)

相同的代码,格式化:
var_dump(memory_get_usage()); // int(92224)  
$a=range(1,99999);
var_dump(memory_get_usage()); // int(20342024)
$b=&$a;
var_dump(memory_get_usage()); // int(20342152)
$c=&$a;
var_dump(memory_get_usage()); // int(20342280)

如您所见,通过引用进行多次赋值几乎没有使用内存。

在将其发布到 bugs.php.net 之前,我想知道它是否是我不知道的预期行为。有谁知道为什么会这样?

最佳答案

函数和调用都需要 &。所以以下

function &bar() {
static $x;
if (NULL === $x) {
$x=range(1,99999);
}
return $x;}

var_dump(memory_get_usage());
bar();
var_dump(memory_get_usage());
$b1=&bar();
var_dump(memory_get_usage());
$b2=&bar();
var_dump(memory_get_usage());
$b3=&bar();
var_dump(memory_get_usage());

会给你
int(54296)
int(7843472)
int(7843520)
int(7843520)
int(7843544)

关于PHP:ref 从函数返回的值似乎在多个赋值中被复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3161257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com