Perl API を見ていて、なぜだろうと思っていました。
sv_setref_iv()
IV
その引数をIV
スロットに格納し、sv_setref_nv()
NV
その引数をNV
スロットに格納し、- しかし、その引数をスロットではなくスロットに
sv_setref_pv()
格納しますか?void *
IV
PV
私には予感があります (CUR フィールドと LEN フィールドはそのような変数には意味がありません)、XS に詳しい人の意見を聞きたいです :-)
スカラーにはさまざまな種類があります。
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
SvPV の代わりに SvIV を使用すると、参照ごとに 16 バイト節約できます。