Как массивы реализованы в Perl? - PullRequest
17 голосов
/ 28 июня 2010

Массив Perl является абстрактным типом данных.Каков внутренний механизм для массива Perl?Это реализовано с динамическим массивом или связанным списком?Поскольку элементы массива имеют произвольный доступ, я предполагаю, что динамический массив указателей или ссылок на скаляры имеют смыслОднако с операциями shift и unshift во главе массива, должен ли массив перемещать все свои элементы с этими операциями?звучит неэффективно для меня.Есть мысли?

Ответы [ 2 ]

23 голосов
/ 28 июня 2010

Посмотрите на это: http://www.perlmonks.org/?node_id=17890

(взято оттуда:)

Perl реализует списки с массивом и смещением первого / последнего элемента. Массив выделяется больше, чем необходимо, смещения, изначально указывающие на середину массива, так что есть место для роста в обоих направлениях (unshifts и push / вставки), прежде чем потребуется перераспределение базового массива. Следствием этой реализации является то, что все операторы примитивного списка perl (вставка, выборка, определение размера массива, push, pop, shift, unshift и т. Д.) Выполняются за время O (1).

6 голосов
/ 28 июня 2010

Типы задокументированы в perlguts (см. Perl Internals для соответствующей документации) - и AV для массивов и HV для хэшей.

...