7

在 Perl 之外的其他语言中,当您声明一个整数时,它具有基于变量占用的内存空间量的最小值和最大值。当你在 Perl 中声明一个标量变量时,无论是数字还是字符串,语言是否只为变量值分配足够的空间,然后在以后需要时增加空间,还是 Perl 最初分配大量内存?

4

1 回答 1

8

在 Perl 中,标量变量是指向名为 an 的 C 结构的指针SV。这包括元数据的各种字段,例如引用计数、确定确切类型的位字段以及指向附加(元)数据的指针。

  • 如果将标量用作整数,则称为 anIV并且包含整数。这个整数的大小在编译时是固定的perl。您可以查看perl -V输出以查看各种数据类型的大小。我有ivsize=8。可表示的值与该大小的 C 整数相同。

  • 如果将标量用作小数,则它称为NV(数值)并且通常包含双精度值。同样,确切的大小是在编译时确定的。

  • 如果将标量用作字符串,则称为 aPV并包含指向 C 字符串的指针,以及一些额外的元数据,例如长度。如果 C 字符串增长,则重新分配它。

  • 如果将标量用作字符串和数字,则它是 aPVIVPVNVresp。并包括这两种类型的数据。

  • 还有其他类型,例如引用 ( RV) 或无符号整数 ( UV)。

对于IVand NV,当数字变得足够大时,Perl 不会自动将它们提升为 bignums。

然后是哈希HV和数组AV。这些将SV标头用于引用计数等内容,但指向更复杂的数据结构。

  • 数组包含指向SVs 的指针的 C 数组。如果数组增长,它会被重新分配。

  • 哈希要复杂得多。基本上,它们也是一个数组,但包含哈希条目而不是SVs。此散列中的元素称为存储桶。如果条目与桶的比率太高,则重新分配数组(通常为双倍大小),并将条目新分布在这些桶中。这不是严格必要的,但如果不这样做,则查找O(n)而不是O(1)(即)。


  • 可变大小的数据结构,如字符串、数组、散列,最初是保守分配的。如果需要更多空间,则分配更大的内存,并复制数据。

  • 标量有一个固定大小的标题。当类型改变时(例如通过字符串化),为额外的元数据分配额外的内存。

有关更多信息和令人困惑的指针图,请阅读Illustrated Perl Guts

于 2013-10-11T02:14:49.293 回答