Интерфейс MemoryLayout
- Все известные подинтерфейсы:
-
AddressLayoutPREVIEW,GroupLayoutPREVIEW,PaddingLayoutPREVIEW,SequenceLayoutPREVIEW,StructLayoutPREVIEW,UnionLayoutPREVIEW,ValueLayoutPREVIEW,ValueLayout.OfBooleanPREVIEW,ValueLayout.OfBytePREVIEW,ValueLayout.OfCharPREVIEW,ValueLayout.OfDoublePREVIEW,ValueLayout.OfFloatPREVIEW,ValueLayout.OfIntPREVIEW,ValueLayout.OfLongPREVIEW,ValueLayout.OfShortPREVIEW
public sealed interface MemoryLayout permits SequenceLayoutPREVIEW, GroupLayoutPREVIEW, PaddingLayoutPREVIEW, ValueLayoutPREVIEW
MemoryLayout является предварительным API платформы Java. В иерархии макета есть два листа, макеты значенийПРЕДПРОСМОТР, которые используются для представления значений заданного размера и типа (см. и макеты заполненияПРЕДПРОСМОТР, которые, как следует из названия, используются для представления части сегмента памяти, содержимое которой должно быть пропущено, и которые в основном присутствуют для выравнивания. Некоторые общие константы макета значений, такие как ValueLayout.JAVA_INTПРЕДПРОСМОТР и ValueLayout.JAVA_FLOAT_UNALIGNEDПРЕДПРОСМОТР определены в классе ValueLayoutПРЕДПРОСМОТР. Специальный вид макета значений, а именно макет адресаПРЕДПРОСМОТР используется для моделирования значений, обозначающих адрес области памяти.
Более сложные макеты могут быть получены из более простых: макет последовательностиПРЕДПРОСМОТР обозначает однородное повторение нуля или более вхождений макета элемента; групповой макетПРЕДПРОСМОТР обозначает разнородное объединение нуля или более макетов членов. Групповые макеты бывают двух видов: макет структурыПРЕДПРОСМОТР, где макеты членов выкладываются друг за другом, и макет объединенияПРЕДПРОСМОТР, где макеты членов выкладываются в одном начальном смещении.
Макеты могут быть необязательно связаны с именем. Имя макета может быть использовано при построении путей макета.
Рассмотрим следующее объявление структуры в 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");
Характеристики макетов памяти
Все макеты имеют размер (выраженный в байтах), который определяется следующим образом:- Размер макета значения определяется ValueLayout.carrier()ПРЕДПРОСМОТР, связанным с макетом значения. То есть, константа
ValueLayout.JAVA_INTПРЕДПРОСМОТР имеет носительint, и размер 4 байта; - Размер макета адреса зависит от платформы. То есть, константа
ValueLayout.ADDRESSПРЕДПРОСМОТР имеет размер 8 байт на 64-битной платформе; - Размер макета заполнения всегда задается явно при создании;
- Размер макета последовательности, макет элемента которого — E, а количество элементов — L, равен размеру E, умноженному на L;
- Размер макета структуры с макетами членов M1, M2, ..., Mn, размерами соответственно S1, S2, ..., Sn, равен S1 + S2 + ... + Sn;
- Размер макета объединения U с макетами членов M1, M2, ..., Mn, размерами соответственно S1, S2, ..., Sn, равен max(S1, S2, ... Sn).
Кроме того, все макеты имеют естественное выравнивание (выраженное в байтах), которое определяется следующим образом:
- Естественное выравнивание макета заполнения равно 1;
- Естественное выравнивание макета значения, размер которого — N, равно N;
- Естественное выравнивание макета последовательности, макет элемента которого — E, равно выравниванию E;
- Естественное выравнивание группового макета с макетами членов M1, M2, ..., Mn, выравниваниями соответственно A1, A2, ..., An, равно max(A1, A2 ... An).
withByteAlignment(long)), что может быть полезно для описания макетов с более слабыми или более сильными ограничениями выравнивания. Пути макета
Путь макета используется для однозначного выбора макета, вложенного в другой макет. Пути макета обычно выражаются как последовательность одного или нескольких элементов путиПРЕДПРОСМОТР. (Более формальное определение путей макета приведено ниже).Пути макета можно использовать для:
- получения смещений произвольно вложенных макетов;
- получения обработчика var, который можно использовать для доступа к значению, соответствующему выбранному макету;
- выбора произвольно вложенного макета.
Например, для макета последовательности taggedValues, созданного выше, мы можем получить смещение в байтах макета члена, названного 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()ПРЕДПРОСМОТР, MemoryLayout.PathElement.sequenceElement(long, long)ПРЕДПРОСМОТР выбирают неопределенный элемент в макете последовательности. Обработчик 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, макет адреса, чьим целевым макетомПРЕДПРОСМОТР является макет последовательности из четырех макетов структур. Каждый макет структуры описывает двумерную точку и определяется как пара или ValueLayout.JAVA_INTПРЕДПРОСМОТР координат с именами x и y, соответственно. С помощью элементов пути разыменования мы можем получить обработчик var, который обращается к координате y одной из точек в прямоугольнике, следующим образом:
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. То есть, для каждого элемента пути E1, E2, ... En, в пути макета P, мы вычисляем C_i = f_i(C_i-1), где f_i является функцией выбора, связанной с элементом пути, рассматриваемым в данный момент, обозначенной как E_i. Конечный макет C_i также называется выбранным макетом. Путь макета P считается корректным для исходного макета C_0 в случае, если все его элементы пути E1, E2, ... En корректны для соответствующих входных макетов C_0, C_1, ... C_n-1. Элемент пути E считается корректным для макета L в случае, если выполняется любое из следующих условий:
-
L— это макет последовательности, аE— это элемент пути последовательности (один изMemoryLayout.PathElement.sequenceElement(long)ПРЕВИЮ,MemoryLayout.PathElement.sequenceElement(long, long)ПРЕВИЮ илиMemoryLayout.PathElement.sequenceElement()ПРЕВИЮ). Кроме того, еслиEсодержит один или несколько индексов последовательности, такие индексы должны быть совместимы со счетчиком элементов макета последовательности; -
L— это макет группы, аE— это элемент пути группы (один изMemoryLayout.PathElement.groupElement(String)ПРЕВИЮ илиMemoryLayout.PathElement.groupElement(long)ПРЕВИЮ). Кроме того, элемент пути группы должен ссылаться на допустимый макет члена вL, по имени или индексу; -
L— это макет адреса, аE— это элемент пути разыменованияПРЕВИЮ. Кроме того,Lдолжен определять какой-либо целевой макетПРЕВИЮ.
P, который не является правильно сформированным для начального макета C_0, приведет к IllegalArgumentException.- Требования к реализации:
- Реализации этого интерфейса неизменяемы, потокобезопасны и базируются на значениях.
- Граф иерархии запечатанного класса:
- С:
- 19
Краткое описание вложенных классов
| Модификатор и тип | Интерфейс | Описание |
|---|---|---|
static interface |
MemoryLayout.PathElementPREVIEW |
Предварительный просмотр. Элемент в пути макета. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
long |
byteAlignment() |
Возвращает ограничение выравнивания, связанное с этим макетом, выраженное в байтах. |
default long |
byteOffset |
Вычисляет смещение в байтах макета, выбранного заданным путем макета, где начальный макет в пути — это данный макет. |
default MethodHandle |
byteOffsetHandle |
Создает обработчик методов, который вычисляет смещение в байтах макета, выбранного заданным путем макета, где начальный макет в пути — это данный макет. |
long |
byteSize() |
Возвращает размер макета в байтах. |
boolean |
equals |
Сравнивает указанный объект с этим макетом для проверки равенства. |
int |
hashCode() |
Возвращает значение хэш-кода для этого макета. |
Optional |
name() |
Возвращает имя (если оно есть), связанное с этим макетом. |
static PaddingLayoutPREVIEW |
paddingLayout |
Создаёт макет заполнения заданного размера в байтах. |
default MemoryLayoutPREVIEW |
select |
Возвращает макет, выбранный из предоставленного пути, где начальный макет в пути — это данный макет. |
static SequenceLayoutPREVIEW |
sequenceLayout |
Создаёт макет последовательности с заданным макетом элемента и количеством элементов. |
static SequenceLayoutPREVIEW |
sequenceLayout |
Создаёт макет последовательности с заданным макетом элемента и максимальным количеством элементов, которое не переполняет long. |
default MethodHandle |
sliceHandle |
|
static StructLayoutPREVIEW |
structLayout |
Создаёт макет структуры с заданными макетами членов. |
String |
toString() |
Возвращает строковое представление этого макета. |
static UnionLayoutPREVIEW |
unionLayout |
Создаёт макет объединения с заданными макетами членов. |
default VarHandle |
varHandle |
Создаёт обработчик переменных, который получает доступ к сегменту памяти по смещению, выбранному заданным путем макета, где начальный макет в пути — это данный макет. |
MemoryLayoutPREVIEW |
withByteAlignment |
Возвращает макет памяти с такими же характеристиками, как у этого макета, но с заданным ограничением выравнивания (в байтах). |
MemoryLayoutPREVIEW |
withName |
Возвращает макет памяти с такими же характеристиками, как у этого макета, но с заданным именем. |
MemoryLayoutPREVIEW |
withoutName() |
Возвращает макет памяти с такими же характеристиками, как у этого макета, но без имени. |
Подробное описание методов
byteSize
long byteSize()
- Возвращает:
- размер макета в байтах
name
Optional<String> name()
- Возвращает:
- имя (если есть), связанное с этим макетом
- См. также:
withName
MemoryLayoutPREVIEW withName(String name)
- Параметры:
-
name- имя макета. - Возвращает:
- макет памяти с теми же характеристиками, что и этот макет, но с заданным именем
- См. также:
withoutName
MemoryLayoutPREVIEW withoutName()
- Примечание API:
- Это может быть полезно для сравнения двух макетов, имеющих разные имена, но в остальном равных.
- Возвращает:
- макет памяти с теми же характеристиками, что и этот макет, но без имени
- См. также:
byteAlignment
long byteAlignment()
A, которая представляет собой байтовое выравнивание макета, где A - это количество байтов, которые должны быть выровнены для любого указателя, который правильно указывает на этот макет. Таким образом: -
A=1означает отсутствие выравнивания (в обычном смысле), что часто встречается в пакетах. -
A=8означает выравнивание по словам (в LP64),A=4выравнивание по целым числам,A=2выравнивание по коротким целым числам и т. д. -
A=64- это самое строгое требуемое выравнивание, заданное ABI x86/SV (для данных AVX-512).
withByteAlignment(long)), этот метод возвращает ограничение естественного выравнивания (в байтах), связанное с этим макетом.- Возвращает:
- ограничение выравнивания, связанное с этим макетом, выраженное в байтах
withByteAlignment
MemoryLayoutPREVIEW withByteAlignment(long byteAlignment)
- Параметры:
-
byteAlignment- ограничение выравнивания макета, выраженное в байтах. - Возвращает:
- макет памяти с теми же характеристиками, что и этот макет, но с заданным ограничением выравнивания (в байтах)
- Исключения:
-
IllegalArgumentException- еслиbyteAlignmentне является степенью двойки.
byteOffset
default long byteOffset(MemoryLayout.PathElementPREVIEW... elements)
- Параметры:
-
elements- элементы пути макета. - Возвращает:
- Смещение в байтах выбранного макета с помощью пути макета в
elements. - Исключения:
-
IllegalArgumentException- если путь макета не соответствует формату для этого макета. -
IllegalArgumentException- если путь макета содержит один или несколько элементов открытого пути. -
IllegalArgumentException- если путь макета содержит один или несколько элементов пути ссылок.
byteOffsetHandle
default MethodHandle byteOffsetHandle(MemoryLayout.PathElementPREVIEW... elements)
Возвращаемый обработчик метода имеет следующие характеристики:
- его возвращаемый тип -
long; - он имеет нуль или более параметров типа
long, по одному для каждого элемента открытого пути в предоставленном пути макета. Порядок этих параметров соответствует порядку, в котором элементы открытого пути встречаются в предоставленном пути макета.
Конечное смещение, возвращаемое обработчиком метода, вычисляется следующим образом:
где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 - это статические константы смещения, а s_0, s_1, ... s_n - это статические константы шага, которые выводятся из пути макета.- Примечание API:
- Возвращаемый обработчик метода может использоваться для вычисления смещения макета, аналогично
byteOffset(PathElement...), но более гибко, так как некоторые индексы могут быть указаны при вызове обработчика метода. - Параметры:
-
elements- элементы пути макета. - Возвращает:
- обработчик метода, который вычисляет смещение в байтах выбранного макета по заданному пути.
- Исключения:
-
IllegalArgumentException- если путь макета не соответствует формату для этого макета. -
IllegalArgumentException- если путь макета содержит один или несколько элементов пути ссылок.
varHandle
default VarHandle varHandle(MemoryLayout.PathElementPREVIEW... elements)
Возвращаемый обработчик переменных имеет следующие характеристики:
- его тип выводится из носителяПРЕДПРОСМОТР выбранного расклада значений;
- он имеет ноль или более координат доступа типа
long, по одной для каждого элемента пути открытия в предоставленном пути расклада. Порядок этих координат доступа соответствует порядку, в котором элементы открытого пути встречаются в предоставленном пути расклада.
Конечный адрес, к которому обращается возвращаемый обработчик переменных, можно вычислить следующим образом:
Гдеaddress = base(segment) + offset
base(segment) обозначает функцию, которая возвращает физический базовый адрес доступа к сегменту памяти. Для нативных сегментов эта функция просто возвращает адрес нативного сегментаПРЕДПРОСМОТР. Для сегментов кучи эта функция более сложная, так как адрес сегментов кучи виртуализован. Значение 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 — *статические* константы смещения, и s_1, s_2, ... s_n — *статические* константы шага, которые выводятся из пути расклада. Кроме того, предоставленные динамические значения должны соответствовать границам, выведенным из пути расклада, то есть 0 <= x_i < b_i, в противном случае выбрасывается исключение 1 <= i <= n, или IndexOutOfBoundsException.
Базовый адрес должен быть выровнен в соответствии с ограничением выравнивания корневого расклада (этого расклада). Обратите внимание, что это может быть более строгим (но не менее), чем ограничение выравнивания выбранного расклада значений.
Несколько путей могут быть объединены с помощью элементов пути ссылки. Элемент пути ссылки строит новый нативный сегмент памяти, базовый адрес которого — значение адреса, полученное путём обращения к сегменту памяти по смещению, определённому элементами пути расклада, непосредственно предшествующими элементу пути ссылки. Другими словами, если путь расклада содержит один или несколько элементов пути ссылки, конечный адрес, к которому обращается возвращаемый обработчик переменных, можно вычислить следующим образом:
где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:
- Возвращаемый обработчик переменных имеет определённые *ограничения режима доступа*, которые общие для всех обработчиков представлений сегмента памятиПРЕДПРОСМОТР.
- Параметры:
-
elements- элементы пути расклада. - Возвращает:
- обработчик переменных, который обращается к сегменту памяти по смещению, выбранному заданным путём расклада.
- Выбрасывает:
-
IllegalArgumentException- если путь расклада не корректен для этого расклада. -
IllegalArgumentException- если выбранный путём расклада расклад не является раскладом значенийПРЕДПРОСМОТР. - См. также:
sliceHandle
default MethodHandle sliceHandle(MemoryLayout.PathElementPREVIEW... elements)
Возвращаемый обработчик метода имеет следующие характеристики:
- его тип возврата —
MemorySegment; - он имеет ведущий параметр типа
MemorySegment, соответствующий сегменту памяти, который необходимо нарезать; - он имеет ноль или более параметров типа
long, по одному для каждого элемента пути открытия в предоставленном пути расклада. Порядок этих параметров соответствует порядку, в котором элементы открытого пути встречаются в предоставленном пути расклада.
Смещение возвращаемого сегмента вычисляется следующим образом:
long offset = byteOffset(elements);
long size = select(elements).byteSize();
MemorySegment slice = segment.asSlice(offset, size);
Сегмент, подлежащий нарезке, должен быть выровнен в соответствии с ограничением выравнивания корневого расклада (этого расклада). Обратите внимание, что это может быть более строгим (но не менее), чем ограничение выравнивания выбранного расклада значений.
- Примечание API:
- Возвращаемый обработчик метода может быть использован для получения среза сегмента памяти, аналогично
MemorySegment.asSlice(long, long)ПРЕДПРОСМОТР, но более гибко, поскольку некоторые индексы могут быть указаны при вызове обработчика метода. - Параметры:
-
elements- элементы пути расклада. - Возвращает:
- обработчик метода, используемый для нарезки сегмента памяти по смещению, выбранному заданным путём расклада.
- Выбрасывает:
-
IllegalArgumentException- если путь расклада не корректен для этого расклада. -
IllegalArgumentException- если путь расклада содержит один или несколько элементов пути ссылки.
select
default MemoryLayoutPREVIEW select(MemoryLayout.PathElementPREVIEW... elements)
- Параметры:
-
elements- элементы пути расклада. - Возвращает:
- расклад, выбранный путём расклада в
elements. - Выбрасывает:
-
IllegalArgumentException- если путь расклада не корректен для этого расклада. -
IllegalArgumentException- если путь расклада содержит один или несколько элементов пути ссылки. -
IllegalArgumentException- если путь расклада содержит один или несколько элементов пути, которые выбирают один или несколько индексов последовательности, таких какMemoryLayout.PathElement.sequenceElement(long)ПРЕДПРОСМОТР иMemoryLayout.PathElement.sequenceElement(long, long)ПРЕДПРОСМОТР.
equals
boolean equals(Object other)
true тогда и только тогда, когда указанный объект также является макетом и равен этому макету. Два макета считаются равными, если они одного типа, имеют одинаковый размер, имя и ограничение выравнивания. Кроме того, в зависимости от типа макета, должны быть выполнены дополнительные условия: - два макета значений считаются равными, если у них одинаковый порядокПРОСМОТР и носительПРОСМОТР. Кроме того, два макета адресов считаются равными, если у них также одинаковый целевой макетПРОСМОТР;
- два макета последовательностей считаются равными, если у них одинаковое количество элементов (см.
SequenceLayout.elementCount()ПРОСМОТР), и если их макеты элементов (см.SequenceLayout.elementLayout()ПРОСМОТР) также равны; - два макета групп считаются равными, если они одного типа (см.
StructLayoutПРОСМОТР,UnionLayoutПРОСМОТР) и если их макеты членов (см.GroupLayout.memberLayouts()ПРОСМОТР) также равны.
- Overrides:
-
equalsв классеObject - Parameters:
-
other- объект, который должен быть сравнен на равенство с этим макетом. - Returns:
-
trueесли указанный объект равен этому макету. - See Also:
hashCode
int hashCode()
- Overrides:
-
hashCodeв классеObject - Returns:
- значение хэш-кода для этого макета
- See Also:
toString
String toString()
- Overrides:
-
toStringв классеObject - Returns:
- строковое представление этого макета
paddingLayout
static PaddingLayoutPREVIEW paddingLayout(long byteSize)
- Parameters:
-
byteSize- размер заполнения (в байтах). - Returns:
- новый макет заполнения.
- Throws:
-
IllegalArgumentException- еслиbyteSize <= 0.
sequenceLayout
static SequenceLayoutPREVIEW sequenceLayout(long elementCount, MemoryLayoutPREVIEW elementLayout)
- Parameters:
-
elementCount- количество элементов последовательности. -
elementLayout- макет элемента последовательности. - Returns:
- новый макет последовательности с заданным макетом элемента и размером.
- Throws:
-
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);
- Parameters:
-
elementLayout- макет элемента последовательности. - Returns:
- новый макет последовательности с заданным макетом элемента и максимальным количеством элементов.
- Throws:
-
IllegalArgumentException- еслиelementLayout.byteSize() % elementLayout.byteAlignment() != 0.
structLayout
static StructLayoutPREVIEW structLayout(MemoryLayoutPREVIEW... elements)
- API Note:
- Этот фабричный метод не автоматически выравнивает макеты элементов, вставляя дополнительные макеты заполнения padding layoutПРОСМОТР. В результате, следующее создание макета структуры завершится исключением: Для предотвращения исключения, клиенты могут либо вставить дополнительные макеты заполнения:
structLayout(JAVA_SHORT, JAVA_INT);Или, альтернативно, они могут использовать макет члена с меньшим ограничением выравнивания. Это приведёт к упакованному макету структуры:structLayout(JAVA_SHORT, MemoryLayout.paddingLayout(2), JAVA_INT);structLayout(JAVA_SHORT, JAVA_INT.withByteAlignment(2)); - Parameters:
-
elements- макеты членов макета структуры. - Returns:
- макет структуры с заданными макетами членов.
- Throws:
-
IllegalArgumentException- если сумма размеров в байтах макетов членов переполняется. -
IllegalArgumentException- если макет члена вelementsпоявляется по смещению (относительно начала макета структуры), которое несовместимо с его ограничением выравнивания.
unionLayout
static UnionLayoutPREVIEW unionLayout(MemoryLayoutPREVIEW... elements)
- Parameters:
-
elements- макеты членов макета объединения. - Returns:
- макет объединения с заданными макетами членов.
© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/foreign/MemoryLayout.html
MemoryLayoutтолько при включенных предварительных функциях.