Spec-Zone.ru › OpenJDK 21

Интерфейс 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.
Программы могут использовать MemoryLayout только при включенных предварительных функциях.
Предварительные функции могут быть удалены в будущей версии или обновлены до постоянных функций платформы 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.
Требования к реализации:
Реализации этого интерфейса неизменяемы, потокобезопасны и базируются на значениях.
Граф иерархии запечатанного класса:
Sealed class hierarchy graph for MemoryLayoutSealed class hierarchy graph for MemoryLayout
С:
19

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

Модификатор и тип Интерфейс Описание
static interface  MemoryLayout.PathElementPREVIEW
Предварительный просмотр.
Элемент в пути макета.

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

Модификатор и тип Метод Описание
long byteAlignment()
Возвращает ограничение выравнивания, связанное с этим макетом, выраженное в байтах.
default long byteOffset(MemoryLayout.PathElementPREVIEW... elements)
Вычисляет смещение в байтах макета, выбранного заданным путем макета, где начальный макет в пути — это данный макет.
default MethodHandle byteOffsetHandle(MemoryLayout.PathElementPREVIEW... elements)
Создает обработчик методов, который вычисляет смещение в байтах макета, выбранного заданным путем макета, где начальный макет в пути — это данный макет.
long byteSize()
Возвращает размер макета в байтах.
boolean equals(Object other)
Сравнивает указанный объект с этим макетом для проверки равенства.
int hashCode()
Возвращает значение хэш-кода для этого макета.
Optional<String> 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)
Создаёт макет структуры с заданными макетами членов.
String toString()
Возвращает строковое представление этого макета.
static UnionLayoutPREVIEW unionLayout(MemoryLayoutPREVIEW... elements)
Создаёт макет объединения с заданными макетами членов.
default VarHandle varHandle(MemoryLayout.PathElementPREVIEW... elements)
Создаёт обработчик переменных, который получает доступ к сегменту памяти по смещению, выбранному заданным путем макета, где начальный макет в пути — это данный макет.
MemoryLayoutPREVIEW withByteAlignment(long byteAlignment)
Возвращает макет памяти с такими же характеристиками, как у этого макета, но с заданным ограничением выравнивания (в байтах).
MemoryLayoutPREVIEW withName(String name)
Возвращает макет памяти с такими же характеристиками, как у этого макета, но с заданным именем.
MemoryLayoutPREVIEW withoutName()
Возвращает макет памяти с такими же характеристиками, как у этого макета, но без имени.

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

byteSize

long byteSize()
Возвращает размер макета в байтах.
Возвращает:
размер макета в байтах

name

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

withName

MemoryLayoutPREVIEW withName(String name)
Возвращает макет памяти с теми же характеристиками, что и этот макет, но с заданным именем.
Параметры:
name - имя макета.
Возвращает:
макет памяти с теми же характеристиками, что и этот макет, но с заданным именем
См. также:
  • name()

withoutName

MemoryLayoutPREVIEW withoutName()
Возвращает макет памяти с теми же характеристиками, что и этот макет, но без имени.
Примечание API:
Это может быть полезно для сравнения двух макетов, имеющих разные имена, но в остальном равных.
Возвращает:
макет памяти с теми же характеристиками, что и этот макет, но без имени
См. также:
  • name()

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 - если выбранный путём расклада расклад не является раскладом значенийПРЕДПРОСМОТР.
См. также:
  • MethodHandles.memorySegmentViewVarHandle(ValueLayout)ПРЕДПРОСМОТР

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:
  • Object.hashCode()
  • HashMap

hashCode

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

toString

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

paddingLayout

static PaddingLayoutPREVIEW paddingLayout(long byteSize)
Создаёт макет заполнения заданного размера в байтах. Ограничение выравнивания возвращаемого макета равно 1. Таким образом, независимо от его размера, при отсутствии явного ограничения выравнивания, макет заполнения не влияет на естественное выравнивание макета группы или последовательности, в которую он вложен.
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

Spec-Zone.ru

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