2011-04-23 48 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本身,另一個用於$_