7

Perl 以外の他の言語では、整数を宣言すると、変数が占めるメモリ内のスペースの量に基づいて最小値と最大値が設定されます。Perl でスカラー変数を宣言するとき、それが数値であろうと文字列であろうと、言語は変数値に十分なだけ割り当てて、後で必要に応じてスペースを増やしますか、それとも Perl は最初に大量のメモリを割り当てますか?

4

1 に答える 1

8

Perl では、スカラー変数は an と呼ばれる C 構造体へのポインターSVです。これには、参照カウント、正確な型を決定するビットフィールド、追加の (メタ) データへのポインターなど、メタデータのさまざまなフィールドが含まれます。

  • スカラーを整数として使用する場合、それは anIVと呼ばれ、整数が含まれます。この整数のサイズは、のコンパイル時に固定されperlます。出力を見perl -Vて、さまざまなデータ型のサイズを確認できます。私は持っていivsize=8ます。表現可能な値は、そのサイズの C 整数と同じです。

  • スカラーを 10 進数として使用する場合、それはNV(数値) と呼ばれ、通常は double が含まれます。繰り返しますが、正確なサイズはコンパイル時に決定されます。

  • スカラーを文字列として使用する場合、それは aPVと呼ばれ、C 文字列へのポインターと、長さなどの追加のメタデータが含まれます。C 文字列が大きくなると、再割り当てされます。

  • スカラーを文字列および数値として使用する場合、それは aPVIVまたはPVNVresp です。両方のタイプのデータが含まれています。

  • 参照 ( RV) や符号なし整数 ( UV) などの追加の型があります。

IVandの場合NV、Perl は数値が十分に大きくなっても自動的に bignum にプロモートしません。

次に、ハッシュHVと配列がありますAV。これらは、SV参照カウントなどにヘッダーを使用しますが、より複雑なデータ構造を指します。

  • 配列には、s へのポインターの C 配列が含まれますSV。配列が大きくなると、再割り当てされます。

  • ハッシュははるかに複雑です。基本的に、それらも配列ですが、s の代わりにハッシュ エントリが含まれていますSV。このハッシュの要素はバケットと呼ばれます。エントリとバケットの比率が高すぎる場合、配列は (通常は 2 倍のサイズに) 再割り当てされ、エントリはこれらのバケットに新しく分散されます。これは厳密には必要ではありませんが、これが行われていない場合、O(n)代わりにルックアップが実行されますO(1)(つまり、遅い)。


  • 文字列、配列、ハッシュなどの可変サイズのデータ​​構造は、最初は控えめに割り当てられます。より多くのスペースが必要な場合は、より大きなメモリが割り当てられ、データがコピーされます。

  • スカラーには固定サイズのヘッダーがあります。タイプが変更されると (文字列化などによって)、追加のメタデータ用に追加のメモリが割り当てられます。

詳細と紛らわしいポインター図については、Illustrated Perl Gutsを参照してください。

于 2013-10-11T02:14:49.293 に答える