記憶域の共有

Open PL/I には、記憶域の場所を複数の変数で共有できるように明示的に設計されたストレージ クラスが 2 つ用意されています。その 2 つのストレージ クラスとは、BASED および DEFINED です(UNION 属性を使用して変数の記憶域を明示的に共有することもできます)。

基底付き変数は、宣言時に記憶域が割り当てられません。代わりに、ALLOCATE 文によって割り当てられる記憶域を決定したり、ポインター参照によって修飾された記憶域を記述したりするために使用されます。

定義済み変数は、指定された基準変数の記憶域を使用します。定義済み変数は DEFINED 属性で宣言され、この属性で基準変数も指定されます。

記憶域を共有するためには、定義済み変数とその基準参照が次のいずれかの条件を満たしている必要があります。

  1. 記憶域を共有するすべての変数のデータ型が同じである。
  2. 記憶域を共有するすべての変数が非可変長文字列である (文字列のオーバーレイ定義に適している)。
  3. 記憶域を共有するすべての変数が非整列ビット文字列である (ビット文字列のオーバーレイ定義に適している)。

隣接する記憶域にギャップなしでパックされている文字またはビットのみで構成されている変数は、オーバーレイ定義に適しています(ギャップは、ユーザー定義構造体におけるデータの整列によって生じる可能性がある)。オーバーレイ定義に適した変数は、配列、必要な型の文字列データのみを含む構造体、またはスカラー文字列変数です。次に例を示します。

DECLARE X(4,4) CHARACTER(1);
DECLARE Y(16) CHARACTER(1) DEFINED(X);
DECLARE Z CHARACTER(5) DEFINED(X);
DECLARE 1 S BASED,
   2 A CHARACTER(8),
   2 B CHARACTER(8);

この例では、X に 16 文字の記憶域ブロックがあります。Y はこのブロック全体を共有しますが、Z はブロックの最初の 5 文字のみを共有します。S を使用すると 16 文字のすべてにアクセスできますが、S.A を使用すると最初の 8 文字、S.B を使用すると最後の 8 文字にアクセスできます。基底付き変数に 16 文字を超える文字を使用すると不定の結果になりますが、16 文字以下の文字列は使用できます。同様の例は、非整列ビット データのみを使用して構成することもできます。

その他のデータ型の記憶域の共有ではデータ型が正確に一致する必要がありますが、配列の要素は同じデータ型の非配列変数と共有できます。同様に、構造体のメンバーは同じデータ型の非メンバーと共有できます。

UNION 属性を持つ構造体のメンバーも、物理記憶域の場所を互いに共有します。UNION は、直属のメンバーがすべて同じ物理記憶域の場所を占める構造体のバリエーションです。UNION は定義済み変数のような機能を提供します。UNION 属性は、構造体宣言でレベル番号と併用する場合にのみ使用でき、主構造体または副構造体の直属のメンバーがすべて同じ記憶域を占めることを示します。直属のメンバーとは、レベル番号が自身を含む構造体よりは大きいが、他のメンバーのレベル番号よりは大きくないメンバーです。通常、直属のメンバーのレベル番号は、自身を含む構造体より 1 つ大きくなります(UNION 属性の詳細については、「UNION」を参照してください)。

配列が他の配列と記憶域を共有できるのは、データ型が同じである場合、左と右の比較で等価である場合、またはその両方に当てはまる場合です。構造体が他の構造体と記憶域を共有できるのは、記憶域を共有する構造体と左と右の比較で等価である場合のみです。

左と右の比較で等価であるためには、記憶域を共有する構造体が、共有される記憶域の左側の部分の有効な記述でなければなりません。記憶域の左側の部分の有効な記述であるためには、共有される最後のレベル 2 項目 (その項目に含まれているすべてのメンバーを含む) までのすべてのメンバーが同じでなければなりません。レベル 2 項目のいずれかの部分を共有する場合、そのすべての部分を共有する必要があります。次に例を示します。

DECLARE   1 S,  DECLARE  1 T BASED,  DECLARE  1 U BASED,
          2 A,           2 A,                 2 A,
          2 B,           2 B,                 2 B,
          3 C,           3 C,                 3 C;
          3 D;           3 D;
          2 E;

この例では、T.B.C への参照は S.B.C への有効な参照ですが、U.B.C への参照は無効です。U の宣言ではレベル 2 項目 S.B の全体が記述されていないからです。

ピクチャ変数が他のピクチャ変数と記憶域を共有できるのは、同じピクチャを持つ場合のみです。

引数とパラメーターのマッチングの場合と同様に、ALIGNED、UNALIGNED、VARYING の各属性や文字列変数の宣言された長さはデータ型の一部であり、文字列が文字列のオーバーレイ共有に適している場合を除き、一致する必要があります。

算術変数の記憶域を共有する場合は、基数、スケール、および精度が常に一致する必要があります。