在Perl之外的其他语言中,当您声明一个整数时,它具有基于变量占用的内存空间量的最小值和最大值。 当你在Perl中声明标量变量时,无论是数字还是字符串,语言是否只为变量值分配足够的值,然后在必要时增加空间,或者Perl最初是否分配了大量内存?
答案 0 :(得分:8)
在Perl中,标量变量是指向称为SV
的C结构的指针。这包括元数据的各种字段,如引用计数,确定确切类型的位域,以及指向其他(元)数据的指针。
如果将标量用作整数,则称为IV
并包含整数。此整数的大小在编译perl
时得到修复。您可以查看perl -V
输出以查看各种数据类型的大小。我有ivsize=8
。可表示的值与该大小的C整数相同。
如果使用标量作为小数,则称为NV
(数值)并且通常包含双精度。同样,确切的大小是在编译时确定的。
如果您将标量用作字符串,则称为PV
并包含指向C字符串的指针,以及一些其他元数据,如长度。如果C字符串增长,则会重新分配。
如果您将标量用作字符串和数字,则为PVIV
或PVNV
。并包括两种类型的数据。
还有其他类型,如引用(RV
)或无符号整数(UV
)。
对于IV
和NV
,Perl在数量足够大时不会自动将数字提升为bignums。
然后是哈希HV
和数组AV
。它们使用SV
标题来引用计数,但指向更复杂的数据结构。
数组包含指向SV
的C指针数组。如果数组增长,则重新分配。
哈希要复杂得多。基本上,它们也是一个数组,但包含哈希条目而不是SV
s。此哈希中的元素称为 buckets 。如果条目到桶的比率太高,则重新分配阵列(通常为双倍大小),并在这些桶中新分配条目。这不是严格必要的,但如果不这样做,则查找为O(n)
而不是O(1)
(即慢)。
可变大小的数据结构(如字符串,数组,哈希)最初是保守分配的。如果需要更多空间,则分配更大的内存,并复制数据。
标量有一个恒定大小的标题。当类型改变时(例如通过字符串化),分配额外元数据的附加内存。
有关更多信息和令人困惑的指针图,请阅读Illustrated Perl Guts。