gpt4 book ai didi

arrays - 为什么 Perl 有时会回收引用?

转载 作者:行者123 更新时间:2023-12-05 01:24:27 24 4
gpt4 key购买 nike

以下代码:

use strict;
use warnings;

my @array = (0,1,2,3,4,5,6,7,8,9);
print "array ref is ".\@array."\n";

my @copy_refs;
for my $element(@array) {
my @copy = @array;
print "copy ref is ".\@copy."\n";
push @copy_refs, \@copy;
}

如预期的那样产生以下输出:

array ref is ARRAY(0x21ae640)
copy ref is ARRAY(0x21e2a00)
copy ref is ARRAY(0x21d7368)
copy ref is ARRAY(0x21d71e8)
copy ref is ARRAY(0x21d70c8)
copy ref is ARRAY(0x21d6fa8)
copy ref is ARRAY(0x21d6e88)
copy ref is ARRAY(0x21d6d68)
copy ref is ARRAY(0x21d6c48)
copy ref is ARRAY(0x21cf8a0)
copy ref is ARRAY(0x21cf780)

但是,删除 push @copy_refs,\@copy; 后,相同的代码会产生以下输出:

array ref is ARRAY(0x229e640)
copy ref is ARRAY(0x22d2a00)
copy ref is ARRAY(0x22d2a00)
copy ref is ARRAY(0x22d2a00)
copy ref is ARRAY(0x22d2a00)
copy ref is ARRAY(0x22d2a00)
copy ref is ARRAY(0x22d2a00)
copy ref is ARRAY(0x22d2a00)
copy ref is ARRAY(0x22d2a00)
copy ref is ARRAY(0x22d2a00)
copy ref is ARRAY(0x22d2a00)

这是为什么?

最佳答案

Perl 使用引用计数来确定何时释放变量。一旦没有引用变量,它就会被释放。当变量在范围内时,代码块(例如,subs 和文件)维护对在其中声明的词法变量的引用,因此变量通常在范围退出时被释放。

换句话说,my @copy 分配了一个新数组。当范围退出时,如果没有其他引用它,@copy 将被释放。

当您执行 push @copy_refs,\@copy; 时,@copy_refs 引用数组,因此 @copy 不会被释放。

当你省略 push @copy_refs,\@copy; 时,没有任何引用 @copy,所以它被释放了。这使得内存可用于在下一个循环中重复使用。

有点。

作为一种优化,如果在变量超出范围时没有引用变量,它只会被清除,而不是被销毁并重新创建。所以 @copy 不仅仅是在同一位置重新分配;它实际上是已清除的同一个数组。

关于arrays - 为什么 Perl 有时会回收引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59209934/

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