モジュール java.base
パッケージ java.lang.foreign

インタフェースMemoryLayout

既知のすべてのサブインタフェース:
AddressLayoutPREVIEW, GroupLayoutPREVIEW, PaddingLayoutPREVIEW, SequenceLayoutPREVIEW, StructLayoutPREVIEW, UnionLayoutPREVIEW, ValueLayoutPREVIEW, ValueLayout.OfBooleanPREVIEW, ValueLayout.OfBytePREVIEW, ValueLayout.OfCharPREVIEW, ValueLayout.OfDoublePREVIEW, ValueLayout.OfFloatPREVIEW, ValueLayout.OfIntPREVIEW, ValueLayout.OfLongPREVIEW, ValueLayout.OfShortPREVIEW

MemoryLayoutは、JavaプラットフォームのプレビューAPIです。
プレビュー機能が有効な場合のみ、プログラムでMemoryLayoutを使用できます。
プレビュー機能は、今後のリリースで削除するか、Javaプラットフォームの永続機能にアップグレードすることができます。
メモリー・レイアウトは、メモリー・セグメントの内容を記述します。

レイアウト階層には、「値レイアウト」PREVIEWという2つのリーフがあります。これは、指定されたサイズと種類の値を表すために使用されます(名前が示すように、内容を無視する必要のあるメモリー・セグメントの一部を表すために使用される「パディング・レイアウト」PREVIEWおよび主に整列理由のために存在するメモリー・セグメントの一部を表します)。 ValueLayout.JAVA_INTPREVIEWValueLayout.JAVA_FLOAT_UNALIGNEDPREVIEWなどの一般的な値レイアウト定数は、ValueLayoutPREVIEWクラスで定義されます。 特殊な値レイアウト(「アドレス・レイアウト」PREVIEW)を使用して、メモリーのリージョンのアドレスを示す値をモデル化します。

より複雑なレイアウトをより単純なものから導出できます: 「順序レイアウト」PREVIEWは、要素レイアウトのゼロ個以上の出現の均質な繰返しを示します。「グループ・レイアウト」PREVIEWは、0個以上のメンバー・レイアウトの異機種間集計を示します。 グループ・レイアウトには2つの種類があります: 構造体レイアウトPREVIEW。メンバー・レイアウトは順番に配置され、共用体レイアウトPREVIEWはメンバー・レイアウトが同じ開始オフセットに配置されます。

レイアウトは、オプションでnameに関連付けることができます。 レイアウト名は、レイアウト・パスの作成時に参照できます。

Cでは、次の構造体宣言を考慮してください:

typedef struct {
    char kind;
    int value;
} TaggedValues[5];
前述の宣言は、次のようにレイアウト・オブジェクトを使用してモデル化できます:
SequenceLayout taggedValues = MemoryLayout.sequenceLayout(5,
    MemoryLayout.structLayout(
        ValueLayout.JAVA_BYTE.withName("kind"),
        MemoryLayout.paddingLayout(3),
        ValueLayout.JAVA_INT.withName("value")
    )
).withName("TaggedValues");

メモリー・レイアウトの特性

すべてのレイアウトにはsize (バイトで表されます)があり、次のように定義されています:
  • 値レイアウトのサイズは、値レイアウトに関連付けられたValueLayout.carrier()PREVIEWによって決まります。 つまり、定数ValueLayout.JAVA_INTPREVIEWのキャリアはintで、サイズは4バイトです
  • アドレス・レイアウトのサイズはプラットフォームに依存します。 つまり、64ビット・プラットフォームでは、定数ValueLayout.ADDRESSPREVIEWのサイズは8バイトです
  • パディング・レイアウトのサイズは、常に「紺ストレクション」で明示的に指定されます
  • 要素レイアウトがEで要素数がLのシーケンス・レイアウトのサイズは、EのサイズにLを掛けた値です
  • サイズがS1S2、... SnであるM1M2、... Mnのメンバー・レイアウトを含む構造体レイアウトのサイズは、それぞれS1 + S2 + ... + Snです
  • サイズがS1S2、... Snのメンバー・レイアウトM1M2、... Mnを含む連結レイアウトUのサイズは、max(S1, S2, ... Sn)です。

さらに、すべてのレイアウトには、次のように定義された「自然整列」 (バイトで表されます)があります:

  • パディング・レイアウトの自然な配置は1です
  • サイズがNの値レイアウトの自然な位置合せは、Nです
  • 要素レイアウトがEである順序レイアウトの自然な位置合せは、Eの配置です
  • 整列がそれぞれA1A2、... 「1つの」であるメンバー・レイアウトM1M2、... Mnを含むグループ・レイアウトの自然整列は、max(A1, A2 ... An)です。
レイアウトの配置は、必要に応じて (withByteAlignment(long)を参照してください)で上書きできます。これは、より弱い位置合わせ拘束またはより強い位置合わせ拘束を持つレイアウトを記述するのに便利です。

レイアウト・パス

「レイアウト・パス」は、他のレイアウトにネストされているレイアウトを明確に選択するために使用します。 レイアウト・パスは通常、1つ以上の「パス要素」PREVIEWのシーケンスとして表されます。 (レイアウト・パスのより正式な定義が提供されます。below)。

レイアウト・パスは、次の目的で使用できます:

  • 任意のネストされたレイアウトのoffsetsを取得
  • 選択したレイアウトに対応する値にアクセスするために使用できる「varハンドル」を取得
  • 「選択」は、任意のネストされたレイアウトです。

たとえば、前述のtaggedValues順序レイアウトの場合、first順序要素内のvalueという名前のメンバー・レイアウトのオフセット(バイト)を次のように取得できます:

long valueOffset = taggedValues.byteOffset(PathElement.sequenceElement(0),
                                          PathElement.groupElement("value")); // yields 4
同様に、valueという名前のメンバー・レイアウトを次のように選択できます:
MemoryLayout value = taggedValues.select(PathElement.sequenceElement(),
                                         PathElement.groupElement("value"));

オープン・パス要素

レイアウト・パス要素の一部(「オープン・パス要素」)は、複数のレイアウトを一度に選択できます。 たとえば、オープン・パス要素MemoryLayout.PathElement.sequenceElement()PREVIEWMemoryLayout.PathElement.sequenceElement(long, long)PREVIEWは、順序レイアウトで未指定の要素を選択します。 1つ以上のオープン・パス要素を含むレイアウト・パスから導出されたvarハンドルには、タイプlongの追加の座標があります。この座標は、クライアントがパス内のオープン要素を「バインド」するために使用できます:
VarHandle valueHandle = taggedValues.varHandle(PathElement.sequenceElement(),
                                               PathElement.groupElement("value"));
MemorySegment valuesSegment = ...
int val = (int) valueHandle.get(valuesSegment, 2); // reads the "value" field of the third struct in the array

オープン・パス要素は、「オフセット計算メソッド・ハンドル」の作成にも影響します。 各オープン・パス要素は、取得したメソッド・ハンドルで追加のlongパラメータになります。 このパラメータを使用して、オフセットを計算する順序要素のインデックスを指定できます:

MethodHandle offsetHandle = taggedValues.byteOffsetHandle(PathElement.sequenceElement(),
                                                          PathElement.groupElement("kind"));
long offset1 = (long) offsetHandle.invokeExact(1L); // 8
long offset2 = (long) offsetHandle.invokeExact(2L); // 16

パス要素を間接参照

「間接参照パス要素」という特別な種類のパス要素を使用すると、メモリー・レイアウトから取得されたvarハンドルがポインタに従うことができます。 次のレイアウトを検討します:
StructLayout RECTANGLE = MemoryLayout.structLayout(
        ValueLayout.ADDRESS.withTargetLayout(
                MemoryLayout.sequenceLayout(4,
                        MemoryLayout.structLayout(
                                ValueLayout.JAVA_INT.withName("x"),
                                ValueLayout.JAVA_INT.withName("y")
                        ).withName("point")
                 )
         ).withName("points")
);
このレイアウトは、矩形を記述する構造体のレイアウトです。 「ターゲット・レイアウト」PREVIEWが4つの構造体レイアウトのシーケンス・レイアウトであるアドレス・レイアウトである単一のフィールドpointsが含まれています。 各構造体のレイアウトは2ディメンション・ポイントを記述し、ペアまたはValueLayout.JAVA_INTPREVIEW座標として定義され、それぞれxおよびyという名前が付きます。

間接参照パス要素を使用すると、次のように、矩形内のいずれかの点のy座標にアクセスするvarハンドルを取得できます:

VarHandle rectPointYs = RECTANGLE.varHandle(
        PathElement.groupElement("points"),
        PathElement.dereferenceElement(),
        PathElement.sequenceElement(),
        PathElement.groupElement("y")
);

MemorySegment rect = ...
int rect_y_4 = (int) rectPointYs.get(rect, 2); // rect.points[2]->y

レイアウト・パスの整形式

レイアウト・パスは、「初期レイアウト」とも呼ばれるレイアウトC_0に適用されます。 レイアウト・パスの各パス要素は、現在のレイアウトC_i-1を他のレイアウトC_iに更新する関数と考えることができます。 つまり、レイアウト・パスPのパス要素E1, E2, ... Enごとに、C_i = f_i(C_i-1)をコンピュートします。ここで、f_iは、対象となるパス要素に関連付けられた選択関数で、E_iと示されます。 最後のレイアウトC_iは、「選択したレイアウト」とも呼ばれます。

レイアウト・パスPは、対応する入力レイアウトC_0, C_1, ... C_n-1に対してすべてのパス要素E1, E2, ... Enが整形式になっている場合、初期レイアウトC_0に対して整形式とみなされます。 次のいずれかがtrueの場合、パス要素EはレイアウトLに対して整形式とみなされます:

初期レイアウトC_0に対して整形式ではないレイアウト・パスPを指定しようとすると、IllegalArgumentExceptionになります。

実装要件:
このインタフェースの実装は不変、スレッド・セーフ、およびvalue-basedです。
シール済クラス階層グラフ:
MemoryLayoutのシール済クラス階層グラフMemoryLayoutのシール済クラス階層グラフ
導入されたバージョン:
19
  • ネストされたクラスのサマリー

    ネストされたクラス
    修飾子と型
    インタフェース
    説明
    static interface 
    Preview.
  • メソッドのサマリー

    修飾子と型
    メソッド
    説明
    long
    このレイアウトに関連付けられているバイト単位の配置制約を返します。
    default long
    指定されたレイアウト・パスによって選択されたレイアウトのオフセットをバイト数で計算します。パス内の初期レイアウトはこのレイアウトです。
    default MethodHandle
    指定されたレイアウト・パスによって選択されたレイアウトのオフセット(バイト)を計算するメソッド・ハンドルを作成します。パス内の初期レイアウトはこのレイアウトです。
    long
    レイアウト・サイズをバイト単位で返します。
    boolean
    equals(Object other)
    指定されたオブジェクトをこのレイアウトと比較し、等価性を維持します。
    int
    このレイアウトのハッシュ・コード値を返します。
    このレイアウトに関連付けられている名前(もしあれば)を返します。
    paddingLayout(long byteSize)
    指定されたバイト・サイズでパディング・レイアウトを作成します。
    指定されたパスから選択されたレイアウトを返します。パス内の初期レイアウトはこのレイアウトです。
    sequenceLayout(long elementCount, MemoryLayoutPREVIEW elementLayout)
    指定された要素レイアウトおよび要素数を使用して順序レイアウトを作成します。
    longをオーバーフローしないように、指定された要素レイアウトおよび最大要素数の順序レイアウトを作成します。
    default MethodHandle
    メモリー・セグメントを指定した場合に、指定されたレイアウト・パスで選択されたレイアウトに対応するslicePREVIEWを返すメソッド・ハンドルを作成します。パス内の初期レイアウトはこのレイアウトです。
    指定されたメンバー・レイアウトを使用して構造体レイアウトを作成します。
    このレイアウトの文字列表現を返します。
    指定されたメンバー・レイアウトを使用してユニオン・レイアウトを作成します。
    default VarHandle
    指定されたレイアウト・パスによって選択されたオフセットでメモリー・セグメントにアクセスするvarハンドルを作成します。パス内の初期レイアウトはこのレイアウトになります。
    withByteAlignment(long byteAlignment)
    このレイアウトと同じ特性を持つメモリー・レイアウトを返しますが、指定された整列制約(バイト単位)を使用します。
    このレイアウトと同じ特性を持つメモリー・レイアウトを、指定された名前で返します。
    このレイアウトと同じ特性を持つメモリー・レイアウトを名前なしで返します。
  • メソッドの詳細

    • byteSize

      long byteSize()
      レイアウト・サイズをバイト単位で返します。
      戻り値:
      レイアウト・サイズ(バイト)
    • name

      Optional<String> name()
      このレイアウトに関連付けられている名前(もしあれば)を返します。
      戻り値:
      このレイアウトに関連付けられている名前(もしあれば)
      関連項目:
    • withName

      MemoryLayoutPREVIEW withName(String name)
      このレイアウトと同じ特性を持つメモリー・レイアウトを、指定された名前で返します。
      パラメータ:
      name - レイアウト名。
      戻り値:
      このレイアウトと同じ特性を持つが、指定された名前を持つメモリー・レイアウト
      関連項目:
    • withoutName

      MemoryLayoutPREVIEW withoutName()
      このレイアウトと同じ特性を持つメモリー・レイアウトを名前なしで返します。
      APIのノート:
      これは、異なる名前を持つが等しくない2つのレイアウトを比較する場合に便利です。
      戻り値:
      このレイアウトと同じ特性を持つが名前のないメモリー・レイアウト
      関連項目:
    • byteAlignment

      long byteAlignment()
      このレイアウトに関連付けられているバイト単位の配置制約を返します。 レイアウトの位置合せでは、レイアウトのバイト単位の位置合せである2つのAの累乗を定義します。Aは、このレイアウトを適切に示すポインタに対して整列する必要があるバイト数です。 このため、:
      • A=1では、すべての(通常の意味で)がパケットで共有されないことを意味します。
      • A=8は、aligned (on LP64)、A=4 int aligned、A=2 short alignedなどの単語を意味します。
      • A=64は、x86/SV ABI (AVX-512データ)で必要とされる最も厳密な位置合せです。
      このレイアウト(withByteAlignment(long)を参照してください)に明示的な位置合せ制約が設定されていない場合、このメソッドはこのレイアウトに関連付けられた「自然整列」制約(バイト単位)を返します。
      戻り値:
      このレイアウトに関連付けられた整列制約(バイト単位)
    • withByteAlignment

      MemoryLayoutPREVIEW withByteAlignment(long byteAlignment)
      このレイアウトと同じ特性を持つメモリー・レイアウトを返しますが、指定された整列制約(バイト単位)を使用します。
      パラメータ:
      byteAlignment - バイト単位で表されるレイアウト整列制約。
      戻り値:
      このレイアウトと同じ特性を持つメモリー・レイアウト。ただし、指定された整列制約(バイト単位)
      例外:
      IllegalArgumentException - byteAlignmentが2の累乗でない場合。
    • byteOffset

      default long byteOffset(MemoryLayout.PathElementPREVIEW... elements)
      指定されたレイアウト・パスによって選択されたレイアウトのオフセットをバイト数で計算します。パス内の初期レイアウトはこのレイアウトです。
      パラメータ:
      elements - レイアウト・パスの要素。
      戻り値:
      elementsのレイアウト・パスによって選択されたレイアウトのオフセット(バイト単位)。
      例外:
      IllegalArgumentException - このレイアウトのレイアウト・パスがwell-formedでない場合。
      IllegalArgumentException - レイアウト・パスに1つ以上の「オープン・パス要素」が含まれている場合。
      IllegalArgumentException - レイアウト・パスに1つ以上の「パス要素を間接参照」が含まれている場合。
    • byteOffsetHandle

      default MethodHandle byteOffsetHandle(MemoryLayout.PathElementPREVIEW... elements)
      指定されたレイアウト・パスによって選択されたレイアウトのオフセット(バイト)を計算するメソッド・ハンドルを作成します。パス内の初期レイアウトはこのレイアウトです。

      返されるメソッド・ハンドルには次の特性があります:

      • 戻り型はlongです
      • 指定されたレイアウト・パスの「オープン・パス要素」ごとに1つ、タイプlongの0個以上のパラメータがあります。 これらのパラメータの順序は、指定されたレイアウト・パスでオープン・パス要素が発生する順序に対応します。

      メソッド・ハンドルによって返される最後のオフセットは、次のように計算されます:

      
       offset = c_1 + c_2 + ... + c_m + (x_1 * s_1) + (x_2 * s_2) + ... + (x_n * s_n)
       
      where x_1x_2、 ... x_nlong引数として指定される「動的」値、c_1c_2、...です。c_mは、staticオフセット定数、s_0s_1、...です。s_nは、レイアウト・パスから導出されるstaticスタイルの定数です。

      APIのノート:
      返されたメソッド・ハンドルは、byteOffset(PathElement...)と同様にレイアウト・オフセットをコンピュートするために使用できますが、メソッド・ハンドルの起動時に索引を指定できるため、柔軟性が高くなります。
      パラメータ:
      elements - レイアウト・パスの要素。
      戻り値:
      指定されたレイアウト・パスによって選択されたレイアウトのオフセットをバイト数で計算するメソッド・ハンドル。
      例外:
      IllegalArgumentException - このレイアウトのレイアウト・パスがwell-formedでない場合。
      IllegalArgumentException - レイアウト・パスに1つ以上の「パス要素を間接参照」が含まれている場合。
    • varHandle

      default VarHandle varHandle(MemoryLayout.PathElementPREVIEW... elements)
      指定されたレイアウト・パスによって選択されたオフセットでメモリー・セグメントにアクセスするvarハンドルを作成します。パス内の初期レイアウトはこのレイアウトになります。

      返されるvarハンドルには次の特性があります:

      • その型は、選択した値レイアウトの「キャリア」PREVIEWから導出されます
      • 指定されたレイアウト・パスの「オープン・パス要素」ごとに1つずつ、タイプlongのアクセス座標が0個以上あります。 これらのアクセス座標の順序は、指定されたレイアウト・パスでオープン・パス要素が発生する順序に対応します。

      返されたvarハンドルからアクセスする最終アドレスは次のように計算できます:

      
       address = base(segment) + offset
       
      ここで、base(segment)は、アクセスされるメモリー・セグメントの物理ベース・アドレスを返す関数を示します。 ネイティブ・セグメントの場合、この関数はネイティブ・セグメントのaddressPREVIEWを返します。 ヒープ・セグメントの場合、ヒープ・セグメントのアドレスが仮想化されるため、この関数はより複雑です。 offset値は、次の形式で表すことができます:
      
       offset = c_1 + c_2 + ... + c_m + (x_1 * s_1) + (x_2 * s_2) + ... + (x_n * s_n)
       
      ここで、x_1x_2、... x_nlong引数として提供される「動的」値です。一方、c_1c_2、... c_mstaticオフセット定数で、s_1s_2、... s_nは、レイアウト・パスから導出されるstaticの積層定数です。

      さらに、指定された動的値は、レイアウト・パス(0 <= x_i < b_i)から導出された範囲(1 <= i <= nまたはIndexOutOfBoundsExceptionがスローされる)に準拠している必要があります。

      ベース・アドレスは、ルート・レイアウト(このレイアウト)の「線形拘束」に従って「連携」である必要があります。 これは、選択した値レイアウトの整列制約よりも厳密な(次より小さい)にできます。

      「パス要素を間接参照」を使用して、複数のパスを連鎖できます。 間接参照パス要素は、間接参照パス要素の直前のレイアウト・パス要素によって決定されるオフセットでメモリー・セグメントにアクセスすることによって取得されるアドレス値である、新しいネイティブ・メモリー・セグメントを作成します。 つまり、レイアウト・パスに1つ以上の間接参照パス要素が含まれている場合、返されたvarハンドルによってアクセスされる最終アドレスは次のように計算できます:

      
       address_1 = base(segment) + offset_1
       address_2 = base(segment_1) + offset_2
       ...
       address_k = base(segment_k-1) + offset_k
       
      ここで、kはレイアウト・パスの参照解除パス要素の数、segmentは入力セグメント、segment_1、... segment_k-1は、指定された参照解除パス要素 (例: segment_1は、ベース・アドレスがaddress_1のネイティブ・セグメントです)に関連付けられたアドレスを参照解除することによって取得されるセグメント、およびoffset_1offset_2、... offset_kは、指定された参照解除操作 (これらのオフセットは、前述の計算を使用して取得されます)のあとにパス要素を評価することによって計算されるオフセットです。 これらのより複雑なアクセス操作では、間接参照操作直前のすべてのメモリー・アクセス(アドレスaddress_1address_2、... address_k-1のメモリー・アクセスなど)は、VarHandle.AccessMode.GETアクセス・モードを使用して実行されます。

      APIのノート:
      結果のvarハンドルは、「メモリー・セグメント・ビュー・ハンドル」PREVIEWすべてに共通する特定の「アクセス・モード制限」を備えています。
      パラメータ:
      elements - レイアウト・パスの要素。
      戻り値:
      指定されたレイアウト・パスによって選択されたオフセットでメモリー・セグメントにアクセスするvarハンドル。
      例外:
      IllegalArgumentException - このレイアウトのレイアウト・パスがwell-formedでない場合。
      IllegalArgumentException - 指定されたパスで選択されたレイアウトが「値レイアウト」PREVIEWでない場合。
      関連項目:
    • sliceHandle

      default MethodHandle sliceHandle(MemoryLayout.PathElementPREVIEW... elements)
      メモリー・セグメントを指定した場合に、指定されたレイアウト・パスで選択されたレイアウトに対応するslicePREVIEWを返すメソッド・ハンドルを作成します。パス内の初期レイアウトはこのレイアウトです。

      返されるメソッド・ハンドルには次の特性があります:

      • 戻り型はMemorySegmentです
      • スライスされるメモリー・セグメントに対応する、型MemorySegmentの先頭パラメータがあります
      • 指定されたレイアウト・パスの「オープン・パス要素」ごとに1つ、タイプlongの0個以上のパラメータがあります。 これらのパラメータの順序は、指定されたレイアウト・パスでオープン・パス要素が発生する順序に対応します。

      返されたセグメントのオフセットは次のように計算されます:

      long offset = byteOffset(elements);
      long size = select(elements).byteSize();
      MemorySegment slice = segment.asSlice(offset, size);
      

      スライスされるセグメントは、ルート・レイアウト(このレイアウト)の「線形拘束」に従って「連携」である必要があります。 これは、選択した値レイアウトの整列制約よりも厳密な(次より小さい)にできます。

      APIのノート:
      返されたメソッド・ハンドルを使用して、MemorySegment.asSlice(long, long)PREVIEWと同様にメモリー・セグメント・スライスを取得できますが、メソッド・ハンドルの起動時に索引を指定できるため、柔軟性が向上します。
      パラメータ:
      elements - レイアウト・パスの要素。
      戻り値:
      指定されたレイアウト・パスによって選択されたオフセットでメモリー・セグメントをスライスするために使用されるメソッド・ハンドル。
      例外:
      IllegalArgumentException - このレイアウトのレイアウト・パスがwell-formedでない場合。
      IllegalArgumentException - レイアウト・パスに1つ以上の「パス要素を間接参照」が含まれている場合。
    • select

      指定されたパスから選択されたレイアウトを返します。パス内の初期レイアウトはこのレイアウトです。
      パラメータ:
      elements - レイアウト・パスの要素。
      戻り値:
      elementsでレイアウト・パスによって選択されるレイアウト。
      例外:
      IllegalArgumentException - このレイアウトのレイアウト・パスがwell-formedでない場合。
      IllegalArgumentException - レイアウト・パスに1つ以上の「パス要素を間接参照」が含まれている場合。
      IllegalArgumentException - レイアウト・パスに、1つ以上の順序要素索引(MemoryLayout.PathElement.sequenceElement(long)PREVIEWMemoryLayout.PathElement.sequenceElement(long, long)PREVIEWなど)を選択する1つ以上のパス要素が含まれている場合。
    • equals

      boolean equals(Object other)
      指定されたオブジェクトをこのレイアウトと比較し、等価性を維持します。 指定されたオブジェクトもレイアウトであり、このレイアウトと等しい場合にのみ、trueを返します。 2つのレイアウトが同じ種類で、サイズ、名前および整列制約が同じ場合、2つのレイアウトは同じとみなされます。 また、レイアウトの種類に応じて、追加の条件を満たす必要があります:
      オーバーライド:
      equals、クラスObject
      パラメータ:
      other - このレイアウトと等価性を持たせるために比較するオブジェクト。
      戻り値:
      指定されたオブジェクトがこのレイアウトに等しい場合、true
      関連項目:
    • hashCode

      int hashCode()
      このレイアウトのハッシュ・コード値を返します。
      オーバーライド:
      hashCode、クラスObject
      戻り値:
      このレイアウトのハッシュ・コード値
      関連項目:
    • toString

      String toString()
      このレイアウトの文字列表現を返します。
      オーバーライド:
      toString、クラスObject
      戻り値:
      このレイアウトの文字列表現
    • paddingLayout

      static PaddingLayoutPREVIEW paddingLayout(long byteSize)
      指定されたバイト・サイズでパディング・レイアウトを作成します。 返されるレイアウトの線形拘束は1です。 そのため、サイズに関係なく、explicit整列制約がない場合、パディング・レイアウトは、ネストされるグループまたは順序レイアウトの自然整列には影響しません。
      パラメータ:
      byteSize - パディング・サイズ(バイトで表されます)。
      戻り値:
      新しいセレクタ・レイアウト。
      例外:
      IllegalArgumentException - byteSize <= 0の場合。
    • sequenceLayout

      static SequenceLayoutPREVIEW sequenceLayout(long elementCount, MemoryLayoutPREVIEW elementLayout)
      指定された要素レイアウトおよび要素数を使用して順序レイアウトを作成します。
      パラメータ:
      elementCount - 順序要素の数。
      elementLayout - 順序要素レイアウト。
      戻り値:
      指定された要素レイアウトおよびサイズの新しい順序レイアウト。
      例外:
      IllegalArgumentException - elementCountが負の場合。
      IllegalArgumentException - elementLayout.byteSize() * elementCountがオーバーフローした場合。
      IllegalArgumentException - elementLayout.byteSize() % elementLayout.byteAlignment() != 0の場合。
    • sequenceLayout

      static SequenceLayoutPREVIEW sequenceLayout(MemoryLayoutPREVIEW elementLayout)
      longをオーバーフローしないように、指定された要素レイアウトおよび最大要素数の順序レイアウトを作成します。 これは次のコードと等価です。
      sequenceLayout(Long.MAX_VALUE / elementLayout.byteSize(), elementLayout);
      
      パラメータ:
      elementLayout - 順序要素レイアウト。
      戻り値:
      指定された要素レイアウトおよび最大要素数を持つ新しい順序レイアウト。
      例外:
      IllegalArgumentException - elementLayout.byteSize() % elementLayout.byteAlignment() != 0の場合。
    • structLayout

      static StructLayoutPREVIEW structLayout(MemoryLayoutPREVIEW... elements)
      指定されたメンバー・レイアウトを使用して構造体レイアウトを作成します。
      APIのノート:
      このファクトリでは、追加の「パディング・レイアウト」PREVIEW要素を挿入することによって、要素レイアウトが自動的に整列されることはありません。 したがって、次の構造体レイアウトの作成は例外で失敗します:
      structLayout(JAVA_SHORT, JAVA_INT);
      
      例外を回避するために、クライアントは追加のパディング・レイアウト要素を挿入できます:
      structLayout(JAVA_SHORT, MemoryLayout.paddingLayout(2), JAVA_INT);
      
      または、より小さな整列制約を特徴とするメンバー・レイアウトを使用することもできます。 これにより、構造体レイアウトが「パック済」になります:
      structLayout(JAVA_SHORT, JAVA_INT.withByteAlignment(2));
      
      パラメータ:
      elements - 構造体レイアウトのメンバー・レイアウト。
      戻り値:
      指定されたメンバー・レイアウトを持つ構造体レイアウト。
      例外:
      IllegalArgumentException - メンバー・レイアウトの「バイト・サイズ」の合計がオーバーフローした場合。
      IllegalArgumentException - elementsのメンバー・レイアウトが、その位置合せ制約と互換性がないオフセット(構造体レイアウトの開始に対する相対)で発生した場合。
    • unionLayout

      static UnionLayoutPREVIEW unionLayout(MemoryLayoutPREVIEW... elements)
      指定されたメンバー・レイアウトを使用してユニオン・レイアウトを作成します。
      パラメータ:
      elements - 結合レイアウトのメンバー・レイアウト。
      戻り値:
      特定のメンバー・レイアウトを含むユニオン・レイアウト。