数组是如何在Perl中实现的?

数组是如何在Perl中实现的?,perl,data-structures,language-implementation,Perl,Data Structures,Language Implementation,Perl数组是一种抽象数据类型。Perl数组的内部机制是什么?它是用动态数组还是链表实现的? 由于数组元素具有随机访问权限,因此我假设指针的动态数组或对标量的引用是有意义的。但是,如果在数组的头部执行移位和取消移位操作,那么数组是否必须使用这些操作移动其所有元素?对我来说,听起来效率很低。有什么想法吗 看看这个: (摘自那里:) Perl使用数组和第一/最后一个元素偏移量实现列表。该数组被分配大于所需的偏移量,最初指向数组的中间,因此在需要重新分配底层阵列之前,在两个方向(未移位和推/插入)中都

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

看看这个:

(摘自那里:)


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

类型记录在中(请参阅相关文档),对于数组是AV,对于哈希是HV。

感谢链接。它回答了我的问题。“最初的偏移是指向数组的中间,所以在两个方向上都有增长的空间”,这部分不是真的。数组最初不偏移<代码>perl-MDevel::Peek-e'my@a=“x”。“z”;转储(@a,0);移位@a;转储(@a,0);'(注意
数组
/
ALLOC
)。请注意“数组的分配大于所需”,但并非总是如此。数组可以从没有过度分配开始,但在数组增长时会过度分配。(
perl-MDevel::Peek-e'my@a=0..7;Dump(@a,0);”
显示了一个以无过度分配开始的数组。)