【发布时间】:2010-06-28 05:50:34
【问题描述】:
Perl 数组是一种抽象数据类型。 Perl 数组的内部机制是什么?它是用动态数组还是链表实现的? 由于数组元素具有随机访问权限,因此我假设动态指针数组或对标量的引用是有意义的。但是,在数组的头部使用 shift 和 unshift 操作,数组是否必须通过这些操作移动其所有元素?对我来说听起来效率低下。任何想法?
【问题讨论】:
标签: perl data-structures language-implementation
Perl 数组是一种抽象数据类型。 Perl 数组的内部机制是什么?它是用动态数组还是链表实现的? 由于数组元素具有随机访问权限,因此我假设动态指针数组或对标量的引用是有意义的。但是,在数组的头部使用 shift 和 unshift 操作,数组是否必须通过这些操作移动其所有元素?对我来说听起来效率低下。任何想法?
【问题讨论】:
标签: perl data-structures language-implementation
看看这个:http://www.perlmonks.org/?node_id=17890
(取自那里:)
Perl 使用数组和第一个/最后一个元素偏移量实现列表。分配的数组大于所需的偏移量,最初指向数组中间的偏移量,因此在需要重新分配底层数组之前,在两个方向(取消移位和推送/插入)都有增长空间。这种实现的结果是 perl 的所有原始列表运算符(插入、获取、确定数组大小、推送、弹出、移位、取消移位等)都在 O(1) 时间内执行。
【讨论】:
perl -MDevel::Peek -e'my @a = "x".."z"; Dump(@a, 0); shift @a; Dump(@a, 0);'(注意ARRAY/ALLOC)。
perl -MDevel::Peek -e'my @a = 0..7; Dump(@a, 0);' 显示了一个没有过度分配的数组。)
这些类型记录在 perlguts 中(有关相关文档,请参阅 Perl Internals) - 数组是 AV,哈希是 HV。
【讨论】: