为什么 sv_setref_pv() 将其 void * 参数存储在 IV 插槽中



在查看Perl API时,我想知道为什么

  • sv_setref_iv()将其IV参数存储在IV槽中,
  • sv_setref_nv()将其NV参数存储在NV槽中,
  • 但是sv_setref_pv()将其void *参数存储在IV槽中,而不是PV槽中?

我有一种预感(CUR 和 LEN 字段对这样的变量没有意义),但我想听听了解 XS 知识渊博的人的意见:-)

有许多不同类型的标量。

  • SvNULL 无法保存除 undef 之外的任何值。
  • SvIV能够容纳IV,UV或RV。
  • SvNV能够持有NV。
  • SvPV 能够容纳 PV。
  • SvPVIV能够容纳PV,以及IV,UV或RV。

AV,HV,CV,GV实际上也只是标量类型。

注意我说的是"有能力"持有。您可以将标量视为对象,将上述标量视为类和子类。以上每个都有不同的结构。

拥有这些不同类型的标量可以节省内存。

SvIV(能够容纳 IV 的最小标量类型)小于 SvPV(能够容纳 PV 的最小标量类型)。

$ perl -le'
   use Devel::Size qw( total_size );
   use Inline C => <<'''__EOI__''';
      void upgrade_to_iv(SV* sv) {
         SvUPGRADE(sv, SVt_IV);
      }
      void upgrade_to_pv(SV* sv) {
         SvUPGRADE(sv, SVt_PV);
      }
__EOI__
   { my $x; upgrade_to_iv($x); print total_size($x); }
   { my $x; upgrade_to_pv($x); print total_size($x); }
'
24
40

使用 SvIV 而不是 SvPV 可为每个基准电压源节省 16 个字节。

相关内容

  • 没有找到相关文章

最新更新