3

Perl API を見ていて、なぜだろうと思っていました。

  • sv_setref_iv()IVその引数をIVスロットに格納し、
  • sv_setref_nv()NVその引数をNVスロットに格納し、
  • しかし、その引数をスロットではなくスロットにsv_setref_pv()格納しますか?void *IVPV

私には予感があります (CUR フィールドと LEN フィールドはそのような変数には意味がありません)、XS に詳しい人の意見を聞きたいです :-)

4

1 に答える 1

6

スカラーにはさまざまな種類があります。

  • SvNULL は undef 以外の値を保持できません。
  • SvIV は、IV、UV、または RV を保持できます。
  • SvNV は NV を保持できます。
  • SvPV は PV を保持することができます。
  • SvPVIV は、IV、UV、または RV だけでなく、PV も保持できます。
  • ...

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 バイト節約できます。

于 2014-02-10T14:04:00.150 に答える