Почему Perl перераспределяет память по этой схеме? - PullRequest
5 голосов
/ 23 апреля 2011

Адреса памяти для анонимных массивов естественным образом используются 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 ]

2 голосов
/ 24 апреля 2011

Когда SV освобождены, они фактически помещаются в «свободный» пул.Возможно, порядок, в котором они входят в пул, влияет на порядок, в котором они выходят.

1 голос
/ 24 апреля 2011

В приведенных вами примерах количество адресов не равно «двум, а иногда и больше».Это «количество элементов в анонимном массиве плюс два».Как сказал Икегами, SV освобождаются в пул, поэтому следует ожидать, что адреса будут циклически каким-то образом, если не были предприняты преднамеренные усилия для их извлечения в случайном порядке (что, очевидно, не было сделано).

Остается вопрос, почему длина цикла равна «числу элементов + 2».Возможно, он использует один SV для каждого элемента массива, один для самого arrayref и один для $_?

...