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)
是什么导致了内存管理的这种特性?
答案 0 :(得分:2)
当SV被释放时,它们实际上被放入“免费”池中。也许他们进入游泳池的顺序会影响他们退出的顺序。
答案 1 :(得分:1)
在你给出的一组例子中,地址数量不是“两个,有时甚至更多”。它是“匿名数组中的元素数量加上两个”。正如ikegami所说,SV在释放时会进入池中,因此可以预期地址将以某种方式循环,除非已经有意识地以随机顺序检索它们(显然没有这样做)
剩下的问题是循环的长度是“元素数+2”的原因。也许它为数组的每个元素使用一个SV,一个用于arrayref本身,一个用于$_
?