标量变量如何在内存中执行?

Azr*_*eal 7 perl

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

amo*_*mon 8

在Perl中,标量变量是指向称为a的C结构的指针SV.这包括元数据的各种字段,如引用计数,确定确切类型的位域,以及指向其他(元)数据的指针.

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

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

  • 如果您将标量用作字符串,则将其称为a PV并包含指向C字符串的指针,以及一些其他元数据(如length).如果C字符串增长,则会重新分配C字符串.

  • 如果您将标量用作字符串和数字,则它是a PVIVPVNVresp.并包括两种类型的数据.

  • 还有其他类型,如references(RV)或无符号整数(UV).

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

然后是哈希HV和数组AV.它们使用SV标题来引用计数,但指向更复杂的数据结构.

  • 数组包含一个指向SVs 的C数组.如果数组增长,则重新分配.

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


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

  • 标量有一个恒定大小的标题.当类型改变时(例如通过字符串化),分配用于附加元数据的附加存储器.

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