gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:39:05 24 4
gpt4 key购买 nike

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

最佳答案

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

  • 如果将标量用作整数,则称为 IV并包含一个整数。这个整数的大小在 perl 的编译中是固定的。 .你可以看看perl -V输出以查看各种数据类型的大小。我有 ivsize=8 .可表示的值与该大小的 C 整数相同。
  • 如果使用标量作为小数,则称为 NV (数值)并且通常包含 double 值。同样,确切的大小是在编译时确定的。
  • 如果将标量用作字符串,则称为 PV并包含一个指向 C 字符串的指针,以及一些额外的元数据,如长度。如果 C 字符串增长,则重新分配它。
  • 如果将标量用作字符串和数字,则它是 PVIVPVNV分别并包括两种类型的数据。
  • 还有其他类型,如引用( RV )或无符号整数( UV )。

  • 对于 IVNV , 当数字足够大时,Perl 不会自动将数字提升为 bignum。

    然后是哈希 HV和数组 AV .这些使用 SV诸如引用计数之类的 header ,但指向更复杂的数据结构。
  • 数组包含指向 SV 的指针的 C 数组。 s。如果数组增长,则重新分配。
  • 哈希要复杂得多。基本上,它们也是一个数组,但包含哈希条目而不是 SV s。这个散列中的元素称为桶。如果条目与存储桶的比率太高,则重新分配数组(通常为两倍大小)并且新的条目分布在这些存储桶中。这不是绝对必要的,但如果不这样做,则查找是 O(n)而不是 O(1) (即慢)。


  • 可变大小的数据结构(如字符串、数组、散列)最初是保守分配的。如果需要更多空间,则分配更大的内存,并复制数据。
  • 标量有一个固定大小的 header 。当类型改变时(例如通过字符串化),会为额外的元数据分配额外的内存。

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

    关于perl - 标量变量如何在内存中执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19308873/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com