Spec-Zone.ru › OpenJDK 17

Интерфейс MemoryLayout

Все суперинтерфейсы:
Constable
Все известные реализующие классы:
GroupLayout, SequenceLayout, ValueLayout
public sealed interface MemoryLayout extends Constable permits SequenceLayout, GroupLayout, ValueLayout (not exhaustive)
Макет памяти может использоваться для описания содержимого сегмента памяти в нейтральном к языку формате. В иерархии макета есть два типа листов: макеты значений, которые используются для представления значений заданного размера и типа (см. ValueLayout) и макеты заполнения, которые, как следует из названия, используются для представления части сегмента памяти, содержимое которой должно быть проигнорировано, главным образом для выравнивания (см. paddingLayout(long)). Некоторые общие константы макета значений определены в классе MemoryLayouts.

Более сложные макеты могут быть получены из более простых: последовательный макет обозначает повторение одного или нескольких макетов элементов (см. SequenceLayout); групповой макет обозначает агрегацию (как правило, разнородных) макетов членов (см. GroupLayout).

Например, рассмотрим следующее объявление структуры в C:


 typedef struct {
     char kind;
     int value;
 } TaggedValues[5];
 
Вышеприведенное объявление можно смоделировать с помощью объекта макета следующим образом:

SequenceLayout taggedValues = MemoryLayout.sequenceLayout(5,
    MemoryLayout.structLayout(
        MemoryLayout.valueLayout(8, ByteOrder.nativeOrder()).withName("kind"),
        MemoryLayout.paddingLayout(24),
        MemoryLayout.valueLayout(32, ByteOrder.nativeOrder()).withName("value")
    )
).withName("TaggedValues");
 

Все реализации этого интерфейса должны быть базируемыми на значениях; программисты должны рассматривать экземпляры, которые равны, как взаимозаменяемые и не должны использовать их для синхронизации, иначе может произойти непредсказуемое поведение. Например, в будущей версии синхронизация может завершиться неудачей. Метод equals должен использоваться для сравнения.

Классы, не относящиеся к платформе, не должны реализовывать MemoryLayout напрямую.

Если не указано иное, передача null аргумента или аргумента массива, содержащего один или несколько null элементов методу в этом классе, приводит к тому, что выбрасывается исключение NullPointerException.

Размер, выравнивание и порядок байтов

Все макеты имеют размер; размер макета для макетов значений и заполнения всегда явно указывается; это означает, что описание макета всегда имеет одинаковый размер в битах независимо от платформы, на которой он используется. Для производных макетов размер вычисляется следующим образом:
  • для конечного макета последовательности S, у которого макет элемента — E и размер — L, размер S равен размеру E, умноженному на L
  • размер бесконечного макета последовательности — неизвестен
  • для группового макета G с макетами членов M1, M2, ..., Mn, соответственно, размерами S1, S2, ..., Sn, размер G равен либо S1 + S2 + ... + Sn, либо max(S1, S2, ... Sn) в зависимости от того, является ли группа структурой или объединением, соответственно

Кроме того, все макеты имеют естественное выравнивание, которое можно определить следующим образом:

  • для макета заполнения L естественное выравнивание равно 1 независимо от его размера; то есть в отсутствие явного ограничения на выравнивание макет заполнения не должен влиять на ограничение на выравнивание группового макета, в который он вложен
  • для макета значения L, размер которого равен N, естественное выравнивание L равно N
  • для макета последовательности S, у которого макет элемента — E, естественное выравнивание S равно естественному выравниванию E
  • для группового макета G с макетами членов M1, M2, ..., Mn, соответственно, выравниваниями A1, A2, ..., An, естественное выравнивание G равно max(A1, A2 ... An)
Естественное выравнивание макета может быть переопределено при необходимости (см. withBitAlignment(long)), что может быть полезно для описания гипервыровненных макетов.

Все макеты значений имеют явный порядок байтов (см. ByteOrder), который задается при создании макета.

Пути макета

Путь макета начинается с корневого макета (обычно группового или последовательного макета) и заканчивается вложенным в корневой макет макетом — это выбранный макет пути. Пути макетов обычно представляются как последовательность одного или нескольких экземпляров MemoryLayout.PathElement.

Пути макетов, например, полезны для получения смещений произвольно вложенных макетов внутри другого макета (см. bitOffset(PathElement...)), для быстрого получения дескриптора доступа к памяти, соответствующего выбранному макету (см. varHandle(Class, PathElement...)), для выбора произвольно вложенного макета внутри другого макета (см. select(PathElement...)) или для преобразования вложенного элемента макета внутри другого макета (см. map(UnaryOperator, PathElement...)).

Такие пути макетов могут быть построены программно с помощью методов этого класса. Например, для данного экземпляра макета taggedValues, созданного как описано выше, мы можем получить смещение в битах макета члена, названного value, в первом элементе последовательности следующим образом:


long valueOffset = taggedValues.bitOffset(PathElement.sequenceElement(0),
                                          PathElement.groupElement("value")); // yields 32
 
Аналогично, мы можем выбрать макет члена, названный value, следующим образом:

MemoryLayout value = taggedValues.select(PathElement.sequenceElement(),
                                         PathElement.groupElement("value"));
 
И мы также можем заменить макет, названный value, другим макетом, следующим образом:

MemoryLayout taggedValuesWithHole = taggedValues.map(l -> MemoryLayout.paddingLayout(32),
                                            PathElement.sequenceElement(), PathElement.groupElement("value"));
 
То есть, вышеприведенное объявление идентично следующему, более подробному:

MemoryLayout taggedValuesWithHole = MemoryLayout.sequenceLayout(5,
    MemoryLayout.structLayout(
        MemoryLayout.valueLayout(8, ByteOrder.nativeOrder()).withName("kind"),
        MemoryLayout.paddingLayout(32),
        MemoryLayout.paddingLayout(32)
));
 
Пути макета могут содержать один или несколько свободных измерений. Например, путь макета, проходящий через неопределенный элемент последовательности (то есть, где один из компонентов пути был получен с помощью метода MemoryLayout.PathElement.sequenceElement()) имеет дополнительное свободное измерение, которое необходимо связать во время выполнения. Это важно при получении дескриптора доступа к памяти varHandle из макетов, как показано в следующем коде:

VarHandle valueHandle = taggedValues.varHandle(int.class,
                                               PathElement.sequenceElement(),
                                               PathElement.groupElement("value"));
 
Поскольку путь макета, построенный в приведенном выше примере, содержит ровно одно свободное измерение (поскольку он не указывает, какой макет члена, названный value, должен быть выбран из содержащего последовательности макета), следует, что дескриптор доступа к памяти varHandle valueHandle будет иметь дополнительную long координату доступа.

Путь макета со свободными измерениями также может использоваться для создания дескриптора метода вычисления смещения с помощью метода bitOffset(PathElement...) или byteOffsetHandle(PathElement...). Опять же, свободные измерения переводятся в long параметры созданного дескриптора метода. Дескриптор метода может использоваться для вычисления смещений элементов последовательности в разных индексах, путем предоставления этих индексов при вызове дескриптора метода. Например:


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

Атрибуты макета

Макеты могут быть необязательно связаны с одним или несколькими атрибутами. Атрибут макета образует пару имя/значение, где имя — это String, а значение — это Constable. Наиболее распространенным типом атрибута макета является имя макета (см. LAYOUT_NAME), пользовательское имя, которое может быть связано с макетами памяти и к которому можно обратиться при построении путей макетов.
Требования к реализации:
Реализации этого интерфейса являются неизменяемыми, потокобезопасными и базируемыми на значениях.

Краткое описание вложенных классов

Модификатор и тип Интерфейс Описание
static interface  MemoryLayout.PathElement
Экземпляры этого класса используются для формирования путей макета.

Краткое описание полей

Модификатор и тип Поле Описание
static final String LAYOUT_NAME
Имя атрибута, используемого для указания свойства имя макета памяти (см. name() и withName(String)).

Краткое описание методов

Модификатор и тип Метод Описание
Optional<Constable> attribute(String name)
Возвращает атрибут с заданным именем (если он существует).
Stream<String> attributes()
Возвращает поток имён атрибутов, связанных с этим макетом.
long bitAlignment()
Возвращает ограничение выравнивания, связанное с этим макетом, выраженное в битах.
default long bitOffset(MemoryLayout.PathElement... elements)
Вычисляет смещение, в битах, макета, выбранного заданным путём макета, где путь рассматривается как укоренённый в этом макете.
default MethodHandle bitOffsetHandle(MemoryLayout.PathElement... elements)
Создаёт обработчик метода, который может быть использован для вычисления смещения, в битах, макета, выбранного заданным путём макета, где путь рассматривается как укоренённый в этом макете.
long bitSize()
Вычисляет размер макета в битах.
default long byteAlignment()
Возвращает ограничение выравнивания, связанное с этим макетом, выраженное в байтах.
default long byteOffset(MemoryLayout.PathElement... elements)
Вычисляет смещение, в байтах, макета, выбранного заданным путём макета, где путь рассматривается как укоренённый в этом макете.
default MethodHandle byteOffsetHandle(MemoryLayout.PathElement... elements)
Создаёт обработчик метода, который может быть использован для вычисления смещения, в байтах, макета, выбранного заданным путём макета, где путь рассматривается как укоренённый в этом макете.
default long byteSize()
Вычисляет размер макета в байтах.
Optional<? extends DynamicConstantDesc<? extends MemoryLayout>> describeConstable()
Возвращает Optional, содержащий номинальный дескриптор для этого макета, если он может быть построен, или пустой Optional, если он не может быть построен.
boolean equals(Object that)
Сравнивает указанный объект с этим макетом на равенство.
int hashCode()
Возвращает значение хэш-кода для этого макета.
boolean hasSize()
Указан ли для этого макета размер?
boolean isPadding()
Является ли этот макет макетом заполнения (например, макет, созданный из paddingLayout(long)) ?
default MemoryLayout map(UnaryOperator<MemoryLayout> op, MemoryLayout.PathElement... elements)
Создаёт преобразованную копию этого макета, где выбранный макет из пути, укоренённого в этом макете, заменяется результатом применения данного оператора.
Optional<String> name()
Возвращает имя (если оно есть), связанное с этим макетом.
static MemoryLayout paddingLayout(long size)
Создаёт новый макет заполнения заданного размера.
default MemoryLayout select(MemoryLayout.PathElement... elements)
Выбирает макет из пути, укоренённого в этом макете.
static SequenceLayout sequenceLayout(long elementCount, MemoryLayout elementLayout)
Создаёт новый макет последовательности с заданным макетом элемента и количеством элементов.
static SequenceLayout sequenceLayout(MemoryLayout elementLayout)
Создаёт новый макет последовательности с неограниченным количеством элементов и заданным макетом элемента.
default MethodHandle sliceHandle(MemoryLayout.PathElement... elements)
Создаёт обработчик метода, который, получив сегмент памяти, возвращает срез, соответствующий макету, выбранному заданным путём макета, где путь рассматривается как укоренённый в этом макете.
static GroupLayout structLayout(MemoryLayout... elements)
Создаёт новый макет группировки структура с заданными макетами членов.
String toString()
Возвращает строковое представление этого макета.
static GroupLayout unionLayout(MemoryLayout... elements)
Создаёт новый макет группировки объединение с заданными макетами членов.
static ValueLayout valueLayout(long size, ByteOrder order)
Создаёт макет значения заданного порядка байт и размера.
default VarHandle varHandle(Class<?> carrier, MemoryLayout.PathElement... elements)
Создаёт обработчик переменной доступа к памяти, который может быть использован для разыменования памяти в макете, выбранном заданным путём макета, где путь рассматривается как укоренённый в этом макете.
MemoryLayout withAttribute(String name, Constable value)
Возвращает новый макет памяти, который имеет те же атрибуты, что и этот макет, плюс новый указанный атрибут.
MemoryLayout withBitAlignment(long bitAlignment)
Создаёт новый макет с желаемым ограничением выравнивания.
MemoryLayout withName(String name)
Создаёт новый макет с желаемым именем макета.

Подробное описание полей

LAYOUT_NAME

static final String LAYOUT_NAME
Имя атрибута, используемого для задания свойства name макета памяти (см. name() и withName(String)).
См. также:
  • Значения константного поля

Подробное описание методов

describeConstable

Optional<? extends DynamicConstantDesc<? extends MemoryLayout>> describeConstable()
Возвращает Optional, содержащий номинальный дескриптор для данного макета, если он может быть построен, или пустой Optional, если он не может быть построен.
Задано в:
describeConstable в интерфейсе Constable
Возвращает:
Optional, содержащий результирующий номинальный дескриптор, или пустой Optional, если он не может быть построен.

hasSize

boolean hasSize()
Имеет ли этот макет заданный размер? У макета нет заданного размера, если это (или он содержит) макет последовательности, размер которого не определён (см. SequenceLayout.elementCount()). Макеты значений (см. ValueLayout) и макеты заполнения (см. paddingLayout(long)) всегда имеют определённый размер, поэтому этот метод всегда возвращает true в этих случаях.
Возвращает:
true, если у этого макета есть заданный размер.

bitSize

long bitSize()
Вычисляет размер макета в битах.
Возвращает:
размер макета в битах.
Выбрасывает:
UnsupportedOperationException - если макет является или содержит макет последовательности с неопределённым размером (см. SequenceLayout).

byteSize

default long byteSize()
Вычисляет размер макета в байтах.
Возвращает:
размер макета в байтах.
Выбрасывает:
UnsupportedOperationException - если макет является или содержит макет последовательности с неопределённым размером (см. SequenceLayout), или если bitSize() не кратно 8.

name

Optional<String> name()
Возвращает имя (если есть) связанное с этим макетом.

Это эквивалентно следующему коду:


    attribute(LAYOUT_NAME).map(String.class::cast);
 
Возвращает:
имя макета (если есть).
См. также:
  • withName(String)

withName

MemoryLayout withName(String name)
Создаёт новый макет, содержащий желаемое имя макета.

Это эквивалентно следующему коду:


    withAttribute(LAYOUT_NAME, name);
 
Параметры:
name - имя макета.
Возвращает:
новый макет, такой же, как этот, за исключением связанного с ним имени.
См. также:
  • name()

bitAlignment

long bitAlignment()
Возвращает ограничение выравнивания, связанное с этим макетом, выраженное в битах. Выравнивание макета определяет степень двойки A, которая представляет собой битовое выравнивание макета. Если A <= 8, то A/8 - это количество байтов, которые должны быть выровнены для любого указателя, правильно указывающего на этот макет. Таким образом:
  • A=8 означает отсутствие выравнивания (в обычном понимании), что часто используется в пакетах.
  • A=64 означает выравнивание по слову (на LP64), A=32 - по целым числам, A=16 - по коротким целым числам и т.д.
  • A=512 - самое строгое выравнивание, необходимое для x86/SV ABI (для данных AVX-512).
Если для этого макета не было установлено явного ограничения выравнивания (см. withBitAlignment(long)), то этот метод возвращает ограничение естественного выравнивания (в битах), связанное с этим макетом.
Возвращает:
ограничение выравнивания макета в битах.

byteAlignment

default long byteAlignment()
Возвращает ограничение выравнивания, связанное с этим макетом, выраженное в байтах. Выравнивание макета определяет степень двойки A, которая представляет собой байтовое выравнивание макета, где A - это количество байтов, которые должны быть выровнены для любого указателя, правильно указывающего на этот макет. Таким образом:
  • A=1 означает отсутствие выравнивания (в обычном понимании), что часто используется в пакетах.
  • A=8 означает выравнивание по слову (на LP64), A=4 - по целым числам, A=2 - по коротким целым числам и т.д.
  • A=64 - самое строгое выравнивание, необходимое для x86/SV ABI (для данных AVX-512).
Если для этого макета не было установлено явного ограничения выравнивания (см. withBitAlignment(long)), то этот метод возвращает ограничение естественного выравнивания (в байтах), связанное с этим макетом.
Возвращает:
ограничение выравнивания макета в байтах.
Выбрасывает:
UnsupportedOperationException - если bitAlignment() не кратно 8.

withBitAlignment

MemoryLayout withBitAlignment(long bitAlignment)
Создаёт новый макет с желаемым ограничением выравнивания.
Параметры:
bitAlignment - ограничение выравнивания макета, выраженное в битах.
Возвращает:
новый макет, такой же, как этот, за исключением связанного с ним ограничения выравнивания.
Выбрасывает:
IllegalArgumentException - если bitAlignment не является степенью двойки или меньше 8.

attribute

Optional<Constable> attribute(String name)
Возвращает атрибут с заданным именем (если он существует).
Параметры:
name - имя атрибута
Возвращает:
атрибут с заданным именем (если он существует).

withAttribute

MemoryLayout withAttribute(String name, Constable value)
Возвращает новый макет памяти, который имеет те же атрибуты, что и этот макет, плюс новый указанный атрибут. Если этот макет уже содержит атрибут с тем же именем, существующее значение атрибута перезаписывается в возвращаемом макете.
Параметры:
name - имя атрибута.
value - значение атрибута.
Возвращает:
новый макет памяти, который имеет те же атрибуты, что и этот макет, плюс новый указанный атрибут.

attributes

Stream<String> attributes()
Возвращает поток имён атрибутов, связанных с этим макетом.
Возвращает:
поток имён атрибутов, связанных с этим макетом.

bitOffset

default long bitOffset(MemoryLayout.PathElement... elements)
Вычисляет смещение, в битах, макета, выбранного заданным путём макета, где путь считается укоренённым в этом макете.
Параметры:
elements - элементы пути макета.
Возвращает:
Смещение, в битах, макета, выбранного путём макета в elements.
Выбрасывает:
IllegalArgumentException - если путь макета не выбирает ни один вложенный макет в этом макете, или если путь макета содержит один или несколько элементов пути, выбирающих несколько индексов элементов последовательности (см. MemoryLayout.PathElement.sequenceElement() и MemoryLayout.PathElement.sequenceElement(long, long)).
UnsupportedOperationException - если у одного из макетов, пройденных путём макета, неопределён размер.
NullPointerException - если либо elements == null, или если любой из элементов в elements является null.

bitOffsetHandle

default MethodHandle bitOffsetHandle(MemoryLayout.PathElement... elements)
Создаёт обработчик метода, который может использоваться для вычисления смещения в битах макета, выбранного заданным путём макета, где путь рассматривается как укоренённый в этом макете.

Возвращаемый обработчик метода имеет тип возвращаемого значения long, и содержит столько типов параметров long, сколько свободных измерений в предоставленном пути макета (см. MemoryLayout.PathElement.sequenceElement(), где порядок параметров соответствует порядку элементов пути. Возвращаемый обработчик метода может использоваться для вычисления смещения макета, аналогично bitOffset(PathElement...), но некоторые индексы последовательности указываются только при вызове обработчика метода.

Конечное смещение, возвращаемое обработчиком метода, вычисляется следующим образом:


    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 — статическими константами шага, которые выводятся из пути макета.
Параметры:
elements - элементы пути макета.
Возвращает:
обработчик метода, который может использоваться для вычисления смещения в битах элемента макета, указанного заданными элементами пути макета, при предоставлении недостающих индексов элемента последовательности.
Исключения:
IllegalArgumentException - если путь макета содержит один или несколько элементов пути, которые выбирают несколько индексов элемента последовательности (см. MemoryLayout.PathElement.sequenceElement(long, long)).
UnsupportedOperationException - если у одного из макетов, пройденных по пути макета, размер не указан.

byteOffset

default long byteOffset(MemoryLayout.PathElement... elements)
Вычисляет смещение в байтах макета, выбранного заданным путём макета, где путь рассматривается как укоренённый в этом макете.
Параметры:
elements - элементы пути макета.
Возвращает:
Смещение в байтах макета, выбранного путём макета, в elements.
Исключения:
IllegalArgumentException - если путь макета не выбирает макет, вложенный в этот макет, или если путь макета содержит один или несколько элементов пути, которые выбирают несколько индексов элемента последовательности (см. MemoryLayout.PathElement.sequenceElement() и MemoryLayout.PathElement.sequenceElement(long, long)).
UnsupportedOperationException - если у одного из макетов, пройденных по пути макета, размер не указан, или если bitOffset(elements) не кратно 8.
NullPointerException - если либо elements == null, или если любой из элементов в elements является null.

byteOffsetHandle

default MethodHandle byteOffsetHandle(MemoryLayout.PathElement... elements)
Создаёт обработчик метода, который может использоваться для вычисления смещения в байтах макета, выбранного заданным путём макета, где путь рассматривается как укоренённый в этом макете.

Возвращаемый обработчик метода имеет тип возвращаемого значения long, и содержит столько типов параметров long, сколько свободных измерений в предоставленном пути макета (см. MemoryLayout.PathElement.sequenceElement(), где порядок параметров соответствует порядку элементов пути. Возвращаемый обработчик метода может использоваться для вычисления смещения макета, аналогично byteOffset(PathElement...), но некоторые индексы последовательности указываются только при вызове обработчика метода.

Конечное смещение, возвращаемое обработчиком метода, вычисляется следующим образом:


    bitOffset = c_1 + c_2 + ... + c_m + (x_1 * s_1) + (x_2 * s_2) + ... + (x_n * s_n)
    offset = bitOffset / 8
 
где x_1, x_2, ... x_n являются динамическими значениями, предоставленными в качестве long аргументов, в то время как c_1, c_2, ... c_m — статические константы смещения, а s_0, s_1, ... s_n — статические константы шага, которые выводятся из пути макета.

Обработчик метода выбросит UnsupportedOperationException, если вычисленное смещение в битах не кратно 8.

Параметры:
elements - элементы пути макета.
Возвращает:
обработчик метода, который может использоваться для вычисления байтового смещения элемента макета, указанного заданными элементами пути макета, при предоставлении недостающих индексов элемента последовательности.
Исключения:
IllegalArgumentException - если путь макета содержит один или несколько элементов пути, которые выбирают несколько индексов элемента последовательности (см. MemoryLayout.PathElement.sequenceElement(long, long)).
UnsupportedOperationException - если у одного из макетов, пройденных по пути макета, размер не указан.

varHandle

default VarHandle varHandle(Class<?> carrier, MemoryLayout.PathElement... elements)
Создаёт обработчик переменной памяти, который может использоваться для разыменования памяти по макету, выбранному заданным путём макета, где путь рассматривается как укоренённый в этом макете.

Финальное местоположение памяти, к которому обращается возвращаемый обработчик переменной памяти, может быть вычислено следующим образом:


    address = base + offset
 
где base обозначает базовый адрес, выраженный с помощью координаты доступа MemorySegment (см. MemorySegment.address() и MemoryAddress.toRawLongValue()), а 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_0, s_1, ... s_n — статические константы шага, которые выводятся из пути макета.
Примечание API:
результирующий обработчик переменной будет иметь дополнительную long координату доступа для каждого неопределённого компонента доступа к последовательности, содержащегося в этом пути макета. Кроме того, возвращаемый обработчик переменной имеет определённые ограничения режима доступа, которые общие для всех обработчиков переменных доступа к памяти.
Параметры:
carrier - тип носителя обработчика переменных.
elements - элементы пути макета.
Возвращает:
обработчик переменной, который может использоваться для разыменования памяти в (возможно вложенном) макете, выбранном путём макета в elements.
Исключения:
UnsupportedOperationException - если путь макета имеет один или несколько элементов с несовместимыми ограничениями выравнивания, или если у одного из макетов, пройденных по пути макета, размер не указан.
IllegalArgumentException - если носитель не представляет примитивный тип, если носитель является void, boolean, или если путь макета в elements не выбирает макет значения (см. ValueLayout), или если выбранный макет значения имеет размер, который не соответствует размеру указанного типа носителя.

sliceHandle

default MethodHandle sliceHandle(MemoryLayout.PathElement... elements)
Создаёт обработчик метода, который, приняв сегмент памяти, возвращает срез, соответствующий макету, выбранному заданным путём макета, где путь рассматривается как укоренённый в этом макете.

Возвращаемый обработчик метода имеет тип возвращаемого значения MemorySegment, содержит MemorySegment параметр в качестве ведущего параметра, представляющего сегмент, подлежащий нарезанию, и содержит столько последующих long типов параметров, сколько свободных измерений в предоставленном пути макета (см. MemoryLayout.PathElement.sequenceElement(), где порядок параметров соответствует порядку элементов пути. Возвращаемый обработчик метода может использоваться для создания среза аналогично MemorySegment.asSlice(long, long), но где аргумент смещения динамически вычисляется на основе индексов, указанных при вызове обработчика метода.

Смещение возвращаемого сегмента вычисляется следующим образом:


    bitOffset = c_1 + c_2 + ... + c_m + (x_1 * s_1) + (x_2 * s_2) + ... + (x_n * s_n)
    offset = bitOffset / 8
 
где x_1, x_2, ... x_n являются динамическими значениями, предоставленными в качестве long аргументов, в то время как c_1, c_2, ... c_m являются статическими константами смещения, а s_0, s_1, ... s_n — статические константы шага, которые выводятся из пути макета.

После вычисления смещения возвращаемый сегмент создаётся так, как если бы был вызван:


    segment.asSlice(offset, layout.byteSize());
 
где segment — сегмент, подлежащий нарезанию, а layout — макет, выбранный заданным путём макета, согласно select(PathElement...).

Обработчик метода выбросит UnsupportedOperationException, если вычисленное смещение в битах не кратно 8.

Параметры:
elements - элементы пути макета.
Возвращает:
обработчик метода, который может использоваться для создания среза выбранного элемента макета, заданного сегментом.
Исключения:
UnsupportedOperationException - если размер выбранного макета в битах не кратен 8.

select

default MemoryLayout select(MemoryLayout.PathElement... elements)
Выбирает макет из пути, укоренённого в этом макете.
Параметры:
elements - элементы пути макета.
Возвращает:
макет, выбранный путем макета в elements.
Исключение:
IllegalArgumentException - если путь макета не выбирает какой-либо вложенный макет в этом макете или если путь макета содержит один или несколько элементов пути, которые выбирают один или несколько индексов элементов последовательности (см. MemoryLayout.PathElement.sequenceElement(long) и MemoryLayout.PathElement.sequenceElement(long, long)).

map

default MemoryLayout map(UnaryOperator<MemoryLayout> op, MemoryLayout.PathElement... elements)
Создаёт преобразованную копию этого макета, где выбранный макет, из пути, укоренённого в этом макете, заменяется результатом применения заданной операции.
Параметры:
op - унарная операция, которая должна быть применена к выбранному макету.
elements - элементы пути макета.
Возвращает:
новый макет, где макет, выбранный путем макета в elements, был заменён результатом применения op к выбранному макету.
Исключение:
IllegalArgumentException - если путь макета не выбирает какой-либо вложенный макет в этом макете или если путь макета содержит один или несколько элементов пути, которые выбирают один или несколько индексов элементов последовательности (см. MemoryLayout.PathElement.sequenceElement(long) и MemoryLayout.PathElement.sequenceElement(long, long)).

isPadding

boolean isPadding()
Является ли этот макет макетом заполнения (например, макет создан из paddingLayout(long)) ?
Возвращает:
true, если этот макет — макет заполнения.

equals

boolean equals(Object that)
Сравнивает указанный объект с этим макетом на равенство. Возвращает true тогда и только тогда, когда указанный объект также является макетом и равен этому макету. Два макета считаются равными, если они имеют одинаковый тип, размер, имя и ограничения выравнивания. Кроме того, в зависимости от типа макета, должны быть выполнены дополнительные условия:
  • два макета значений считаются равными, если у них одинаковый порядок байтов (см. ValueLayout.order())
  • два макета последовательностей считаются равными, если у них одинаковое количество элементов (см. SequenceLayout.elementCount()), и если их макеты элементов (см. SequenceLayout.elementLayout()) также равны
  • два макета групп считаются равными, если они имеют одинаковый тип (см. GroupLayout.isStruct(), GroupLayout.isUnion()) и если их макеты членов (см. GroupLayout.memberLayouts()) также равны
Переопределяет:
equals в классе Object
Параметры:
that - объект, который нужно сравнить на равенство с этим макетом.
Возвращает:
true , если указанный объект равен этому макету.
См. также:
  • Object.hashCode()
  • HashMap

hashCode

int hashCode()
Возвращает значение хэш-кода для этого макета.
Переопределяет:
hashCode в классе Object
Возвращает:
значение хэш-кода для этого макета.
См. также:
  • Object.equals(java.lang.Object)
  • System.identityHashCode(java.lang.Object)

toString

String toString()
Возвращает строковое представление этого макета.
Переопределяет:
toString в классе Object
Возвращает:
строковое представление этого макета.

paddingLayout

static MemoryLayout paddingLayout(long size)
Создаёт новый макет заполнения заданного размера.
Параметры:
size - размер заполнения в битах.
Возвращает:
новый макет-селектор.
Исключение:
IllegalArgumentException - если size <= 0.

valueLayout

static ValueLayout valueLayout(long size, ByteOrder order)
Создаёт макет значения заданного порядка байтов и размера.
Параметры:
size - размер макета значения.
order - порядок байтов макета значения.
Возвращает:
новый макет значения.
Исключение:
IllegalArgumentException - если size <= 0.

sequenceLayout

static SequenceLayout sequenceLayout(long elementCount, MemoryLayout elementLayout)
Создаёт новый макет последовательности с заданным макетом элемента и количеством элементов.
Параметры:
elementCount - количество элементов последовательности.
elementLayout - макет элемента последовательности.
Возвращает:
новый макет последовательности с заданным макетом элемента и размером.
Исключение:
IllegalArgumentException - если elementCount < 0.

sequenceLayout

static SequenceLayout sequenceLayout(MemoryLayout elementLayout)
Создаёт новый макет последовательности с неограниченным количеством элементов и заданным макетом элемента.
Параметры:
elementLayout - макет элемента макета последовательности.
Возвращает:
новый макет последовательности с заданным макетом элемента.

structLayout

static GroupLayout structLayout(MemoryLayout... elements)
Создаёт новый макет группы struct с заданными макетами членов.
Параметры:
elements - Макеты членов макета группы struct.
Возвращает:
новый макет группы struct с заданными макетами членов.

unionLayout

static GroupLayout unionLayout(MemoryLayout... elements)
Создаёт новый макет группы union с заданными макетами членов.
Параметры:
elements - Макеты членов макета union.
Возвращает:
новый макет группы union с заданными макетами членов.

© 1993, 2021, 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/17/docs/api/jdk.incubator.foreign/jdk/incubator/foreign/MemoryLayout.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API