gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:05:53 25 4
gpt4 key购买 nike

在看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 个字节。

关于perl - 为什么 sv_setref_pv() 将其 void * 参数存储在 IV 槽中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21678758/

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