Perl 以外の他の言語では、整数を宣言すると、変数が占めるメモリ内のスペースの量に基づいて最小値と最大値が設定されます。Perl でスカラー変数を宣言するとき、それが数値であろうと文字列であろうと、言語は変数値に十分なだけ割り当てて、後で必要に応じてスペースを増やしますか、それとも Perl は最初に大量のメモリを割り当てますか?
1 に答える
Perl では、スカラー変数は an と呼ばれる C 構造体へのポインターSV
です。これには、参照カウント、正確な型を決定するビットフィールド、追加の (メタ) データへのポインターなど、メタデータのさまざまなフィールドが含まれます。
スカラーを整数として使用する場合、それは an
IV
と呼ばれ、整数が含まれます。この整数のサイズは、のコンパイル時に固定されperl
ます。出力を見perl -V
て、さまざまなデータ型のサイズを確認できます。私は持っていivsize=8
ます。表現可能な値は、そのサイズの C 整数と同じです。スカラーを 10 進数として使用する場合、それは
NV
(数値) と呼ばれ、通常は double が含まれます。繰り返しますが、正確なサイズはコンパイル時に決定されます。スカラーを文字列として使用する場合、それは a
PV
と呼ばれ、C 文字列へのポインターと、長さなどの追加のメタデータが含まれます。C 文字列が大きくなると、再割り当てされます。スカラーを文字列および数値として使用する場合、それは a
PVIV
またはPVNV
resp です。両方のタイプのデータが含まれています。参照 (
RV
) や符号なし整数 (UV
) などの追加の型があります。
IV
andの場合NV
、Perl は数値が十分に大きくなっても自動的に bignum にプロモートしません。
次に、ハッシュHV
と配列がありますAV
。これらは、SV
参照カウントなどにヘッダーを使用しますが、より複雑なデータ構造を指します。
配列には、s へのポインターの C 配列が含まれます
SV
。配列が大きくなると、再割り当てされます。ハッシュははるかに複雑です。基本的に、それらも配列ですが、s の代わりにハッシュ エントリが含まれています
SV
。このハッシュの要素はバケットと呼ばれます。エントリとバケットの比率が高すぎる場合、配列は (通常は 2 倍のサイズに) 再割り当てされ、エントリはこれらのバケットに新しく分散されます。これは厳密には必要ではありませんが、これが行われていない場合、O(n)
代わりにルックアップが実行されますO(1)
(つまり、遅い)。
文字列、配列、ハッシュなどの可変サイズのデータ構造は、最初は控えめに割り当てられます。より多くのスペースが必要な場合は、より大きなメモリが割り当てられ、データがコピーされます。
スカラーには固定サイズのヘッダーがあります。タイプが変更されると (文字列化などによって)、追加のメタデータ用に追加のメモリが割り当てられます。
詳細と紛らわしいポインター図については、Illustrated Perl Gutsを参照してください。