【问题标题】:How are arrays implemented in Perl?Perl 中的数组是如何实现的?
【发布时间】:2010-06-28 05:50:34
【问题描述】:

Perl 数组是一种抽象数据类型。 Perl 数组的内部机制是什么?它是用动态数组还是链表实现的? 由于数组元素具有随机访问权限,因此我假设动态指针数组或对标量的引用是有意义的。但是,在数组的头部使用 shift 和 unshift 操作,数组是否必须通过这些操作移动其所有元素?对我来说听起来效率低下。任何想法?

【问题讨论】:

    标签: perl data-structures language-implementation


    【解决方案1】:

    看看这个:http://www.perlmonks.org/?node_id=17890

    (取自那里:)

    Perl 使用数组和第一个/最后一个元素偏移量实现列表。分配的数组大于所需的偏移量,最初指向数组中间的偏移量,因此在需要重新分配底层数组之前,在两个方向(取消移位和推送/插入)都有增长空间。这种实现的结果是 perl 的所有原始列表运算符(插入、获取、确定数组大小、推送、弹出、移位、取消移位等)都在 O(1) 时间内执行。

    【讨论】:

    • 感谢您的链接。它回答了我的问题。
    • Re "最初指向数组中间的偏移量,因此在两个方向都有增长空间",这部分不正确。数组最初没有偏移。 perl -MDevel::Peek -e'my @a = "x".."z"; Dump(@a, 0); shift @a; Dump(@a, 0);'(注意ARRAY/ALLOC)。
    • Re "分配的数组比需要的大",并非总是如此。数组可以从没有过度分配开始,但是当数组增长时它会过度分配。 (perl -MDevel::Peek -e'my @a = 0..7; Dump(@a, 0);' 显示了一个没有过度分配的数组。)
    【解决方案2】:

    这些类型记录在 perlguts 中(有关相关文档,请参阅 Perl Internals) - 数组是 AV,哈希是 HV。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 2020-10-18
      • 2010-09-26
      • 2018-10-31
      • 2010-09-19
      • 1970-01-01
      相关资源
      最近更新 更多