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