- 既知のすべてのサブインタフェース:
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です。
レイアウト階層には、「値レイアウト」PREVIEWという2つのリーフがあります。これは、指定されたサイズと種類の値を表すために使用されます(名前が示すように、内容を無視する必要のあるメモリー・セグメントの一部を表すために使用される「パディング・レイアウト」PREVIEWおよび主に整列理由のために存在するメモリー・セグメントの一部を表します)。 ValueLayout.JAVA_INT
PREVIEWやValueLayout.JAVA_FLOAT_UNALIGNED
PREVIEWなどの一般的な値レイアウト定数は、ValueLayout
PREVIEWクラスで定義されます。 特殊な値レイアウト(「アドレス・レイアウト」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_INT
PREVIEWのキャリアはint
で、サイズは4バイトです - アドレス・レイアウトのサイズはプラットフォームに依存します。 つまり、64ビット・プラットフォームでは、定数
ValueLayout.ADDRESS
PREVIEWのサイズは8バイトです - パディング・レイアウトのサイズは、常に「紺ストレクション」で明示的に指定されます
- 要素レイアウトがEで要素数がLのシーケンス・レイアウトのサイズは、EのサイズにLを掛けた値です
- サイズがS1、S2、... SnであるM1、M2、... Mnのメンバー・レイアウトを含む構造体レイアウトのサイズは、それぞれS1 + S2 + ... + Snです
- サイズがS1、S2、... Snのメンバー・レイアウトM1、M2、... Mnを含む連結レイアウトUのサイズは、max(S1, S2, ... Sn)です。
さらに、すべてのレイアウトには、次のように定義された「自然整列」 (バイトで表されます)があります:
- パディング・レイアウトの自然な配置は1です
- サイズがNの値レイアウトの自然な位置合せは、Nです
- 要素レイアウトがEである順序レイアウトの自然な位置合せは、Eの配置です
- 整列がそれぞれA1、A2、... 「1つの」であるメンバー・レイアウトM1、M2、... Mnを含むグループ・レイアウトの自然整列は、max(A1, A2 ... An)です。
withByteAlignment(long)
を参照してください)で上書きできます。これは、より弱い位置合わせ拘束またはより強い位置合わせ拘束を持つレイアウトを記述するのに便利です。
レイアウト・パス
「レイアウト・パス」は、他のレイアウトにネストされているレイアウトを明確に選択するために使用します。 レイアウト・パスは通常、1つ以上の「パス要素」PREVIEWのシーケンスとして表されます。 (レイアウト・パスのより正式な定義が提供されます。below)。レイアウト・パスは、次の目的で使用できます:
たとえば、前述の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()
PREVIEW、MemoryLayout.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")
);
points
が含まれています。 各構造体のレイアウトは2ディメンション・ポイントを記述し、ペアまたはValueLayout.JAVA_INT
PREVIEW座標として定義され、それぞれ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
に対して整形式とみなされます:
L
はシーケンス・レイアウトで、E
はシーケンス・パス要素(MemoryLayout.PathElement.sequenceElement(long)
PREVIEW、MemoryLayout.PathElement.sequenceElement(long, long)
PREVIEWまたはMemoryLayout.PathElement.sequenceElement()
PREVIEWのいずれか)です。 さらに、E
に1つ以上のシーケンス・インデックスが含まれている場合、このようなインデックスはシーケンス・レイアウトの要素数と互換性がある必要がありますL
はグループ・レイアウトで、E
はグループ・パス要素(MemoryLayout.PathElement.groupElement(String)
PREVIEWまたはMemoryLayout.PathElement.groupElement(long)
PREVIEWのいずれか)です。 さらに、グループ・パス要素は、名前または索引のいずれかでL
の有効なメンバー・レイアウトを参照する必要がありますL
はアドレス・レイアウトで、E
は「間接参照パス要素」PREVIEWです。 さらに、L
では、「ターゲット・レイアウト」PREVIEWを定義する必要があります。
C_0
に対して整形式ではないレイアウト・パスP
を指定しようとすると、IllegalArgumentException
になります。- 実装要件:
- このインタフェースの実装は不変、スレッド・セーフ、およびvalue-basedです。
- シール済クラス階層グラフ:
- 導入されたバージョン:
- 19
-
ネストされたクラスのサマリー
ネストされたクラス -
メソッドのサマリー
修飾子と型メソッド説明long
このレイアウトに関連付けられているバイト単位の配置制約を返します。default long
byteOffset
(MemoryLayout.PathElementPREVIEW... elements) 指定されたレイアウト・パスによって選択されたレイアウトのオフセットをバイト数で計算します。パス内の初期レイアウトはこのレイアウトです。default MethodHandle
byteOffsetHandle
(MemoryLayout.PathElementPREVIEW... elements) 指定されたレイアウト・パスによって選択されたレイアウトのオフセット(バイト)を計算するメソッド・ハンドルを作成します。パス内の初期レイアウトはこのレイアウトです。long
byteSize()
レイアウト・サイズをバイト単位で返します。boolean
指定されたオブジェクトをこのレイアウトと比較し、等価性を維持します。int
hashCode()
このレイアウトのハッシュ・コード値を返します。name()
このレイアウトに関連付けられている名前(もしあれば)を返します。static PaddingLayoutPREVIEW
paddingLayout
(long byteSize) 指定されたバイト・サイズでパディング・レイアウトを作成します。default MemoryLayoutPREVIEW
select
(MemoryLayout.PathElementPREVIEW... elements) 指定されたパスから選択されたレイアウトを返します。パス内の初期レイアウトはこのレイアウトです。static SequenceLayoutPREVIEW
sequenceLayout
(long elementCount, MemoryLayoutPREVIEW elementLayout) 指定された要素レイアウトおよび要素数を使用して順序レイアウトを作成します。static SequenceLayoutPREVIEW
sequenceLayout
(MemoryLayoutPREVIEW elementLayout) long
をオーバーフローしないように、指定された要素レイアウトおよび最大要素数の順序レイアウトを作成します。default MethodHandle
sliceHandle
(MemoryLayout.PathElementPREVIEW... elements) static StructLayoutPREVIEW
structLayout
(MemoryLayoutPREVIEW... elements) 指定されたメンバー・レイアウトを使用して構造体レイアウトを作成します。toString()
このレイアウトの文字列表現を返します。static UnionLayoutPREVIEW
unionLayout
(MemoryLayoutPREVIEW... elements) 指定されたメンバー・レイアウトを使用してユニオン・レイアウトを作成します。default VarHandle
varHandle
(MemoryLayout.PathElementPREVIEW... elements) 指定されたレイアウト・パスによって選択されたオフセットでメモリー・セグメントにアクセスするvarハンドルを作成します。パス内の初期レイアウトはこのレイアウトになります。withByteAlignment
(long byteAlignment) このレイアウトと同じ特性を持つメモリー・レイアウトを返しますが、指定された整列制約(バイト単位)を使用します。このレイアウトと同じ特性を持つメモリー・レイアウトを、指定された名前で返します。このレイアウトと同じ特性を持つメモリー・レイアウトを名前なしで返します。
-
メソッドの詳細
-
byteSize
long byteSize()レイアウト・サイズをバイト単位で返します。- 戻り値:
- レイアウト・サイズ(バイト)
-
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個以上のパラメータがあります。 これらのパラメータの順序は、指定されたレイアウト・パスでオープン・パス要素が発生する順序に対応します。
メソッド・ハンドルによって返される最後のオフセットは、次のように計算されます:
whereoffset = c_1 + c_2 + ... + c_m + (x_1 * s_1) + (x_2 * s_2) + ... + (x_n * s_n)
x_1
、x_2
、 ...x_n
はlong
引数として指定される「動的」値、c_1
、c_2
、...です。c_m
は、staticオフセット定数、s_0
、s_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_1
、x_2
、...x_n
はlong
引数として提供される「動的」値です。一方、c_1
、c_2
、...c_m
はstaticオフセット定数で、s_1
、s_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_1
、offset_2
、...offset_k
は、指定された参照解除操作 (これらのオフセットは、前述の計算を使用して取得されます)のあとにパス要素を評価することによって計算されるオフセットです。 これらのより複雑なアクセス操作では、間接参照操作直前のすべてのメモリー・アクセス(アドレスaddress_1
、address_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
default MemoryLayoutPREVIEW select(MemoryLayout.PathElementPREVIEW... elements) 指定されたパスから選択されたレイアウトを返します。パス内の初期レイアウトはこのレイアウトです。- パラメータ:
elements
- レイアウト・パスの要素。- 戻り値:
elements
でレイアウト・パスによって選択されるレイアウト。- 例外:
IllegalArgumentException
- このレイアウトのレイアウト・パスがwell-formedでない場合。IllegalArgumentException
- レイアウト・パスに1つ以上の「パス要素を間接参照」が含まれている場合。IllegalArgumentException
- レイアウト・パスに、1つ以上の順序要素索引(MemoryLayout.PathElement.sequenceElement(long)
PREVIEWやMemoryLayout.PathElement.sequenceElement(long, long)
PREVIEWなど)を選択する1つ以上のパス要素が含まれている場合。
-
equals
boolean equals(Object other) 指定されたオブジェクトをこのレイアウトと比較し、等価性を維持します。 指定されたオブジェクトもレイアウトであり、このレイアウトと等しい場合にのみ、true
を返します。 2つのレイアウトが同じ種類で、サイズ、名前および整列制約が同じ場合、2つのレイアウトは同じとみなされます。 また、レイアウトの種類に応じて、追加の条件を満たす必要があります:- 2つの値レイアウトは、同じorderPREVIEWおよび「キャリア」PREVIEWを持つ場合、等しいとみなされます。 また、同じ「ターゲット・レイアウト」PREVIEWがある場合、2つのアドレス・レイアウトは等しいとみなされます
- 2つのシーケンス・レイアウトは、同じ要素数(
SequenceLayout.elementCount()
PREVIEWを参照してください)があり、その要素レイアウト(SequenceLayout.elementLayout()
PREVIEWを参照してください)も等しい場合、等しいとみなされます - 2つのグループ・レイアウトは、同じタイプ(
StructLayout
PREVIEW、UnionLayout
PREVIEWを参照してください)で、メンバー・レイアウト(GroupLayout.memberLayouts()
PREVIEWを参照してください)も同じ場合、同じとみなされます。
-
hashCode
int hashCode()このレイアウトのハッシュ・コード値を返します。 -
toString
String toString()このレイアウトの文字列表現を返します。 -
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
- 結合レイアウトのメンバー・レイアウト。- 戻り値:
- 特定のメンバー・レイアウトを含むユニオン・レイアウト。
-
MemoryLayout
を使用できます。