2011-04-23 26 views
5

匿名数组的内存地址自然被perl重用。这个例子说明,他们两个地址之间的周期为空数组:为什么Perl会按照这种模式重新分配内存?

$ perl -E "say [] for (1..6)" 
ARRAY(0x37b23c) 
ARRAY(0x37b28c) 
ARRAY(0x37b23c) 
ARRAY(0x37b28c) 
ARRAY(0x37b23c) 
ARRAY(0x37b28c) 

我想到了为什么它不能立即重新分配内存的一些理论,当我发现周期并不总是两个地址长。以下示例的周期为3和4.

$ perl -E "say [0] for (1..6)" 
ARRAY(0x39b23c) 
ARRAY(0x39b2ac) 
ARRAY(0x39b28c) 
ARRAY(0x39b23c) 
ARRAY(0x39b2ac) 
ARRAY(0x39b28c) 

$ perl -E "say [0,0] for (1..6)" 
ARRAY(0x64b23c) 
ARRAY(0x64b2cc) 
ARRAY(0x64b2ac) 
ARRAY(0x64b28c) 
ARRAY(0x64b23c) 
ARRAY(0x64b2cc) 

是什么导致了这种内存管理特性?

+2

你为什么在意? – 2011-04-23 15:49:40

+0

@Jonathan,我在执行模微积分;) 好奇心。 – Tim 2011-04-23 15:52:26

+0

您应该阅读'perldoc perlguts'并加入Perl Porters的邮件列表http://lists.perl.org/list/perl5-porters.html – shawnhcorey 2011-04-23 17:04:03

回答

2

当SV被释放时,实际上被放入一个“空闲”池中。也许他们进入游泳池的顺序影响它们退出的顺序。

1

在您给出的一组示例中,地址数不是“两个,有时甚至更多”。它是“匿名数组中元素的数量,加上两个”。正如ikegami所说,SVs在被释放时会进入一个池中,所以可以预期这些地址会以某种方式循环,除非有意识地努力以随机顺序检索它们(显然还没有完成) 。

剩下的问题就是为什么周期的长度是“元素数量+2”。也许它对阵列的每个元素使用一个SV,一个用于arrayref本身,另一个用于$_