为什么Perl会按照这种模式重新分配内存?

为什么Perl会按照这种模式重新分配内存?,perl,memory,interpreter,Perl,Memory,Interpreter,匿名数组的内存地址自然会被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

匿名数组的内存地址自然会被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)

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

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

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


那么,剩下的问题是为什么周期的长度是“元素数+2”。也许它对数组的每个元素使用了一个SV,一个用于arrayref本身,另一个用于
$\ucode>?

@Jonathan,我正在实现模演算;)好奇心。你应该阅读<代码> perLoc文档perggts < /> >并加入Perl Poter的邮件列表@肖恩:谢谢指针,虽然它有点像将C++问题重定向到RFC。这是一个实现细节,它可能从版本变为版本,甚至可能从一台机器到另一台机器。我怀疑您能否在Perl开发/移植社区之外获得更多信息。@Svante:您可能是对的。我仍然很好奇,是哪种技术导致了当前实现中的这种行为。希望了解perl内部工作原理的人能够浏览到。