Spec-Zone.ru › OpenJDK 25

Интерфейс SegmentAllocator

Все известные подинтерфейсы:
Arena
Функциональный интерфейс:
Это функциональный интерфейс, поэтому его можно использовать в качестве цели присваивания для лямбда-выражения или ссылки на метод.
@FunctionalInterface public interface SegmentAllocator
Объект, который можно использовать для выделения сегментов памяти. Клиенты, реализующие этот интерфейс, должны реализовать метод allocate(long, long). Аллокатор сегментов определяет несколько методов, которые могут быть полезны для создания сегментов из различных типов значений Java, таких как примитивы и массивы.

SegmentAllocator — это функциональный интерфейс. Клиенты могут легко получить новый аллокатор сегментов с помощью лямбда-выражения или ссылки на метод:

SegmentAllocator autoAllocator = (byteSize, byteAlignment) -> Arena.ofAuto().allocate(byteSize, byteAlignment);

Этот интерфейс определяет фабричные методы для часто используемых аллокаторов:

  • slicingAllocator(MemorySegment) возвращает эффективный аллокатор с разбиением на срезы, который выделяет память, многократно создавая срезы предоставленного сегмента памяти;
  • prefixAllocator(MemorySegment) возвращает аллокатор, который оборачивает сегмент и повторно использует его содержимое при каждом новом запросе на выделение памяти.

Передача аллокатора сегментов в API может быть особенно полезна в случаях, когда клиенту нужно указать, где следует хранить результаты определённой операции (выполняемой API) в виде сегмента памяти. Например, дескрипторы методов для вызовов во внешнюю функциюОГРАНИЧЕНО могут принимать дополнительный параметр SegmentAllocator, если известно, что лежащая в основе внешняя функция возвращает структуру по значению. Таким образом, параметр аллокатора указывает линкеру, где хранить возвращаемое значение внешней функции.

Примечание к API:
Если не указано иное, метод allocate(long, long) не является потокобезопасным. Кроме того, сегменты памяти, выделенные аллокатором сегментов, могут иметь разные сроки жизни и даже быть связаны с перекрывающимися областями памяти. Поэтому клиентам, как правило, следует взаимодействовать только с аллокатором сегментов, которым они владеют.

Вместо этого клиентам следует рассмотреть возможность использования арены, которая обеспечивает строгие гарантии потокобезопасности, срока жизни и отсутствия перекрытий.

Начиная с версии:
22

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

Модификатор и тип Метод Описание
default MemorySegment allocate(long byteSize)
Возвращает новый сегмент памяти с заданным byteSize.
MemorySegment allocate(long byteSize, long byteAlignment)
Возвращает новый сегмент памяти с заданными byteSize и byteAlignment.
default MemorySegment allocate(MemoryLayout layout)
Возвращает новый сегмент памяти с заданным описанием.
default MemorySegment allocate(MemoryLayout elementLayout, long count)
Возвращает новый сегмент памяти с заданными elementLayout и count.
default MemorySegment allocateFrom(AddressLayout layout, MemorySegment value)
Возвращает новый сегмент памяти, инициализированный адресом предоставленного сегмента памяти.
default MemorySegment allocateFrom(ValueLayout.OfByte layout, byte value)
Возвращает новый сегмент памяти, инициализированный предоставленным значением типа byte.
default MemorySegment allocateFrom(ValueLayout.OfByte elementLayout, byte... elements)
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива byte.
default MemorySegment allocateFrom(ValueLayout.OfChar layout, char value)
Возвращает новый сегмент памяти, инициализированный предоставленным значением типа char.
default MemorySegment allocateFrom(ValueLayout.OfChar elementLayout, char... elements)
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива char.
default MemorySegment allocateFrom(ValueLayout.OfDouble layout, double value)
Возвращает новый сегмент памяти, инициализированный предоставленным значением типа double.
default MemorySegment allocateFrom(ValueLayout.OfDouble elementLayout, double... elements)
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива double.
default MemorySegment allocateFrom(ValueLayout.OfFloat layout, float value)
Возвращает новый сегмент памяти, инициализированный предоставленным значением типа float.
default MemorySegment allocateFrom(ValueLayout.OfFloat elementLayout, float... elements)
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива float.
default MemorySegment allocateFrom(ValueLayout.OfInt layout, int value)
Возвращает новый сегмент памяти, инициализированный предоставленным значением типа int.
default MemorySegment allocateFrom(ValueLayout.OfInt elementLayout, int... elements)
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива int.
default MemorySegment allocateFrom(ValueLayout.OfLong layout, long value)
Возвращает новый сегмент памяти, инициализированный предоставленным значением типа long.
default MemorySegment allocateFrom(ValueLayout.OfLong elementLayout, long... elements)
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива long.
default MemorySegment allocateFrom(ValueLayout.OfShort layout, short value)
Возвращает новый сегмент памяти, инициализированный предоставленным значением типа short.
default MemorySegment allocateFrom(ValueLayout.OfShort elementLayout, short... elements)
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива short.
default MemorySegment allocateFrom(ValueLayout elementLayout, MemorySegment source, ValueLayout sourceElementLayout, long sourceOffset, long elementCount)
Возвращает новый сегмент памяти, инициализированный содержимым предоставленного сегмента.
default MemorySegment allocateFrom(String str)
Преобразует строку Java в C-строку с завершающим нулевым символом, используя кодировку UTF-8, и сохраняет результат в сегменте памяти.
default MemorySegment allocateFrom(String str, Charset charset)
Преобразует строку Java в C-строку с завершающим нулевым символом, используя предоставленную кодировку, и сохраняет результат в сегменте памяти.
static SegmentAllocator prefixAllocator(MemorySegment segment)
Возвращает аллокатор сегментов, который обрабатывает запросы на выделение памяти, повторно используя один сегмент.
static SegmentAllocator slicingAllocator(MemorySegment segment)
Возвращает аллокатор сегментов, который обрабатывает запросы на выделение памяти, возвращая последовательные срезы предоставленного сегмента.

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

allocateFrom

default MemorySegment allocateFrom(String str)
Преобразует строку Java в строку C с завершающим нулевым символом, используя кодировку UTF-8, и сохраняет результат в сегменте памяти.

Вызов этого метода эквивалентен следующему коду:

 allocateFrom(str, StandardCharsets.UTF_8);
Параметры:
str — строка Java, которую нужно преобразовать в строку C
Возвращает:
новый нативный сегмент, содержащий преобразованную строку C

allocateFrom

default MemorySegment allocateFrom(String str, Charset charset)
Преобразует строку Java в строку C с завершающим нулевым символом, используя указанную кодировку, и сохраняет результат в сегменте памяти.

Этот метод всегда заменяет некорректные последовательности входных данных и последовательности символов, которые невозможно отобразить, стандартным массивом байтов-заменителей этой кодировки. Если требуется больший контроль над процессом кодирования, следует использовать класс CharsetEncoder.

Если заданная строка содержит символы '\0', они также будут скопированы. Это означает, что в зависимости от использованного метода чтения строки, например MemorySegment.getString(long), при повторном чтении строка будет выглядеть усечённой.

Требования к реализации:
Реализация этого метода по умолчанию копирует содержимое предоставленной строки Java в новый сегмент памяти, полученный вызовом this.allocate(B + N), где:
  • B — размер строки в байтах, закодированной с использованием предоставленной кодировки (например, str.getBytes(charset).length);
  • N — размер (в байтах) символа-терминатора в соответствии с предоставленной кодировкой. Например, для StandardCharsets.US_ASCII он равен 1, а для StandardCharsets.UTF_16 — 2.
Параметры:
str — строка Java, которую нужно преобразовать в строку C
charset — кодировка, используемая для кодирования байтов строки
Возвращает:
новый нативный сегмент, содержащий преобразованную строку C
Вызывает:
IllegalArgumentException — если charset не является стандартной кодировкой

allocateFrom

default MemorySegment allocateFrom(ValueLayout.OfByte layout, byte value)
Возвращает новый сегмент памяти, инициализированный заданным значением byte.

Размер выделенного сегмента памяти равен размеру заданного макета. Указанное значение записывается в сегмент в соответствии с порядком байтов и ограничением выравнивания заданного макета.

Требования к реализации:
Реализация по умолчанию эквивалентна следующему коду:
 MemorySegment seg = allocate(Objects.requireNonNull(layout));
 seg.set(layout, 0, value);
 return seg;
Параметры:
layout — макет выделяемого блока памяти
value — значение, которое будет установлено в новом сегменте памяти
Возвращает:
новый сегмент памяти, инициализированный заданным значением byte

allocateFrom

default MemorySegment allocateFrom(ValueLayout.OfChar layout, char value)
Возвращает новый сегмент памяти, инициализированный заданным значением char.

Размер выделенного сегмента памяти равен размеру заданного макета. Указанное значение записывается в сегмент в соответствии с порядком байтов и ограничением выравнивания заданного макета.

Требования к реализации:
Реализация по умолчанию эквивалентна следующему коду:
 MemorySegment seg = allocate(Objects.requireNonNull(layout));
 seg.set(layout, 0, value);
 return seg;
Параметры:
layout — макет выделяемого блока памяти
value — значение, которое будет установлено в новом сегменте памяти
Возвращает:
новый сегмент памяти, инициализированный заданным значением char

allocateFrom

default MemorySegment allocateFrom(ValueLayout.OfShort layout, short value)
Возвращает новый сегмент памяти, инициализированный заданным значением short.

Размер выделенного сегмента памяти равен размеру заданного макета. Указанное значение записывается в сегмент в соответствии с порядком байтов и ограничением выравнивания заданного макета.

Требования к реализации:
Реализация по умолчанию эквивалентна следующему коду:
 MemorySegment seg = allocate(Objects.requireNonNull(layout));
 seg.set(layout, 0, value);
 return seg;
Параметры:
layout — макет выделяемого блока памяти
value — значение, которое будет установлено в новом сегменте памяти
Возвращает:
новый сегмент памяти, инициализированный заданным значением short

allocateFrom

default MemorySegment allocateFrom(ValueLayout.OfInt layout, int value)
Возвращает новый сегмент памяти, инициализированный заданным значением int.

Размер выделенного сегмента памяти равен размеру заданного макета. Указанное значение записывается в сегмент в соответствии с порядком байтов и ограничением выравнивания заданного макета.

Требования к реализации:
Реализация по умолчанию эквивалентна следующему коду:
 MemorySegment seg = allocate(Objects.requireNonNull(layout));
 seg.set(layout, 0, value);
 return seg;
Параметры:
layout — макет выделяемого блока памяти
value — значение, которое будет установлено в новом сегменте памяти
Возвращает:
новый сегмент памяти, инициализированный заданным значением int

allocateFrom

default MemorySegment allocateFrom(ValueLayout.OfFloat layout, float value)
Возвращает новый сегмент памяти, инициализированный заданным значением float.

Размер выделенного сегмента памяти равен размеру заданного макета. Указанное значение записывается в сегмент в соответствии с порядком байтов и ограничением выравнивания заданного макета.

Требования к реализации:
Реализация по умолчанию эквивалентна следующему коду:
 MemorySegment seg = allocate(Objects.requireNonNull(layout));
 seg.set(layout, 0, value);
 return seg;
Параметры:
layout — макет выделяемого блока памяти
value — значение, которое будет установлено в новом сегменте памяти
Возвращает:
новый сегмент памяти, инициализированный заданным значением float

allocateFrom

default MemorySegment allocateFrom(ValueLayout.OfLong layout, long value)
Возвращает новый сегмент памяти, инициализированный заданным значением long.

Размер выделенного сегмента памяти равен размеру заданного макета. Указанное значение записывается в сегмент в соответствии с порядком байтов и ограничением выравнивания заданного макета.

Требования к реализации:
Реализация по умолчанию эквивалентна следующему коду:
 MemorySegment seg = allocate(Objects.requireNonNull(layout));
 seg.set(layout, 0, value);
 return seg;
Параметры:
layout — макет выделяемого блока памяти
value — значение, которое будет установлено в новом сегменте памяти
Возвращает:
новый сегмент памяти, инициализированный заданным значением long

allocateFrom

default MemorySegment allocateFrom(ValueLayout.OfDouble layout, double value)
Возвращает новый сегмент памяти, инициализированный заданным значением double.

Размер выделенного сегмента памяти равен размеру заданного макета. Указанное значение записывается в сегмент в соответствии с порядком байтов и ограничением выравнивания заданного макета.

Требования к реализации:
Реализация по умолчанию эквивалентна следующему коду:
 MemorySegment seg = allocate(Objects.requireNonNull(layout));
 seg.set(layout, 0, value);
 return seg;
Параметры:
layout — макет выделяемого блока памяти
value — значение, которое будет установлено в новом сегменте памяти
Возвращает:
новый сегмент памяти, инициализированный заданным значением double

allocateFrom

default MemorySegment allocateFrom(AddressLayout layout, MemorySegment value)
Возвращает новый сегмент памяти, инициализированный адресом предоставленного сегмента памяти.

Значение адреса может быть усечено в соответствии с размером адреса платформы (см. ValueLayout.ADDRESS).

Размер выделенного сегмента памяти равен размеру заданного макета. Указанное значение записывается в сегмент в соответствии с порядком байтов и ограничением выравнивания заданного макета.

Требования к реализации:
Реализация по умолчанию эквивалентна следующему коду:
 Objects.requireNonNull(value);
 MemorySegment seg = allocate(Objects.requireNonNull(layout));
 seg.set(layout, 0, value);
 return seg;
Параметры:
layout — макет выделяемого блока памяти
value — значение, которое будет установлено в новом сегменте памяти
Возвращает:
новый сегмент памяти, инициализированный адресом предоставленного сегмента памяти
Вызывает:
IllegalArgumentException — если value не является нативным сегментом

allocateFrom

default MemorySegment allocateFrom(ValueLayout elementLayout, MemorySegment source, ValueLayout sourceElementLayout, long sourceOffset, long elementCount)
Возвращает новый сегмент памяти, инициализированный содержимым предоставленного сегмента.

Размер выделенного сегмента памяти равен elementLayout.byteSize() * elementCount. Содержимое исходного сегмента копируется в результирующий сегмент поэлементно, в соответствии с порядком байтов и ограничением выравнивания заданного макета элементов.

Требования к реализации:
Реализация этого метода по умолчанию эквивалентна следующему коду:
MemorySegment dest = this.allocate(elementLayout, elementCount);
MemorySegment.copy(source, sourceElementLayout, sourceOffset, dest, elementLayout, 0, elementCount);
return dest;
Параметры:
elementLayout — макет элементов выделяемого массива
source — исходный сегмент
sourceElementLayout — макет элементов исходного сегмента
sourceOffset — начальное смещение исходного сегмента в байтах
elementCount — количество элементов исходного сегмента для копирования
Возвращает:
новый сегмент памяти, инициализированный содержимым предоставленного сегмента
Вызывает:
IllegalArgumentException — если elementLayout.byteSize() != sourceElementLayout.byteSize()
IllegalArgumentException — если исходный сегмент или смещение несовместимы с ограничением выравнивания в макете элементов источника
IllegalArgumentException — если elementLayout.byteAlignment() > elementLayout.byteSize()
IllegalArgumentException — если sourceElementLayout.byteAlignment() > sourceElementLayout.byteSize()
IllegalStateException — если область действия, связанная с source, не является активной
WrongThreadException — если этот метод вызывается из потока T, так что source.isAccessibleBy(T) == false
IllegalArgumentException — если elementCount * sourceElementLayout.byteSize() переполняется
IllegalArgumentException — если elementCount < 0
IndexOutOfBoundsException — если sourceOffset > source.byteSize() - (elementCount * sourceElementLayout.byteSize())
IndexOutOfBoundsException — если sourceOffset < 0

allocateFrom

default MemorySegment allocateFrom(ValueLayout.OfByte elementLayout, byte... elements)
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива byte.

Размер выделенного сегмента памяти равен elementLayout.byteSize() * elements.length. Содержимое исходного массива копируется в результирующий сегмент поэлементно, в соответствии с порядком байтов и ограничением выравнивания заданного макета элементов.

Требования к реализации:
Реализация этого метода по умолчанию эквивалентна следующему коду:
 this.allocateFrom(layout, MemorySegment.ofArray(array),
                   ValueLayout.JAVA_BYTE, 0, array.length)
Параметры:
elementLayout — макет элементов выделяемого массива
elements — элементы byte, которые будут скопированы в новый блок памяти
Возвращает:
новый сегмент памяти, инициализированный элементами предоставленного массива byte
Вызывает:
IllegalArgumentException — если elementLayout.byteAlignment() > elementLayout.byteSize()

allocateFrom

default MemorySegment allocateFrom(ValueLayout.OfShort elementLayout, short... elements)
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива short.

Размер выделенного сегмента памяти равен elementLayout.byteSize() * elements.length. Элементы исходного массива копируются в результирующий сегмент поэлементно, в соответствии с порядком байтов и ограничением выравнивания заданного макета элементов.

Требования к реализации:
Реализация этого метода по умолчанию эквивалентна следующему коду:
 this.allocateFrom(layout, MemorySegment.ofArray(array),
                   ValueLayout.JAVA_SHORT, 0, array.length)
Параметры:
elementLayout — макет элементов выделяемого массива
elements — элементы short, которые будут скопированы в новый блок памяти
Возвращает:
новый сегмент памяти, инициализированный элементами предоставленного массива short
Вызывает:
IllegalArgumentException — если elementLayout.byteAlignment() > elementLayout.byteSize()

allocateFrom

default MemorySegment allocateFrom(ValueLayout.OfChar elementLayout, char... elements)
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива char.

Размер выделенного сегмента памяти равен elementLayout.byteSize() * elements.length. Содержимое исходного массива копируется в результирующий сегмент поэлементно, в соответствии с порядком байтов и ограничением выравнивания заданного макета элементов.

Требования к реализации:
Реализация этого метода по умолчанию эквивалентна следующему коду:
 this.allocateFrom(layout, MemorySegment.ofArray(array),
                   ValueLayout.JAVA_CHAR, 0, array.length)
Параметры:
elementLayout — макет элементов выделяемого массива
elements — элементы char, которые будут скопированы в новый блок памяти
Возвращает:
новый сегмент памяти, инициализированный элементами предоставленного массива char
Вызывает:
IllegalArgumentException — если elementLayout.byteAlignment() > elementLayout.byteSize()

allocateFrom

default MemorySegment allocateFrom(ValueLayout.OfInt elementLayout, int... elements)
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива int.

Размер выделенного сегмента памяти равен elementLayout.byteSize() * elements.length. Содержимое исходного массива копируется в результирующий сегмент поэлементно, в соответствии с порядком байтов и ограничением выравнивания заданного макета элементов.

Требования к реализации:
Реализация этого метода по умолчанию эквивалентна следующему коду:
 this.allocateFrom(layout, MemorySegment.ofArray(array),
                   ValueLayout.JAVA_INT, 0, array.length)
Параметры:
elementLayout — макет элементов выделяемого массива
elements — элементы int, которые будут скопированы в новый блок памяти
Возвращает:
новый сегмент памяти, инициализированный элементами предоставленного массива int
Вызывает:
IllegalArgumentException — если elementLayout.byteAlignment() > elementLayout.byteSize()

allocateFrom

default MemorySegment allocateFrom(ValueLayout.OfFloat elementLayout, float... elements)
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива float.

Размер выделенного сегмента памяти равен elementLayout.byteSize() * elements.length. Содержимое исходного массива копируется в результирующий сегмент поэлементно, в соответствии с порядком байтов и ограничением выравнивания заданного макета элементов.

Требования к реализации:
Реализация этого метода по умолчанию эквивалентна следующему коду:
 this.allocateFrom(layout, MemorySegment.ofArray(array),
                   ValueLayout.JAVA_FLOAT, 0, array.length)
Параметры:
elementLayout — макет элементов выделяемого массива
elements — элементы float, которые будут скопированы в новый блок памяти
Возвращает:
новый сегмент памяти, инициализированный элементами предоставленного массива float
Вызывает:
IllegalArgumentException — если elementLayout.byteAlignment() > elementLayout.byteSize()

allocateFrom

default MemorySegment allocateFrom(ValueLayout.OfLong elementLayout, long... elements)
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива long.

Размер выделенного сегмента памяти равен elementLayout.byteSize() * elements.length. Содержимое исходного массива копируется в результирующий сегмент поэлементно, в соответствии с порядком байтов и ограничением выравнивания заданного макета элементов.

Требования к реализации:
Реализация этого метода по умолчанию эквивалентна следующему коду:
 this.allocateFrom(layout, MemorySegment.ofArray(array),
                   ValueLayout.JAVA_LONG, 0, array.length)
Параметры:
elementLayout — макет элементов выделяемого массива
elements — элементы long, которые будут скопированы в новый блок памяти
Возвращает:
новый сегмент памяти, инициализированный элементами предоставленного массива long
Вызывает:
IllegalArgumentException — если elementLayout.byteAlignment() > elementLayout.byteSize()

allocateFrom

default MemorySegment allocateFrom(ValueLayout.OfDouble elementLayout, double... elements)
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива double.

Размер выделенного сегмента памяти равен elementLayout.byteSize() * elements.length. Содержимое исходного массива копируется в результирующий сегмент поэлементно, в соответствии с порядком байтов и ограничением выравнивания заданного макета элементов.

Требования к реализации:
Реализация этого метода по умолчанию эквивалентна следующему коду:
 this.allocateFrom(layout, MemorySegment.ofArray(array),
                   ValueLayout.JAVA_DOUBLE, 0, array.length)
Параметры:
elementLayout — макет элементов выделяемого массива
elements — элементы double, которые будут скопированы в новый блок памяти
Возвращает:
новый сегмент памяти, инициализированный элементами предоставленного массива double
Вызывает:
IllegalArgumentException — если elementLayout.byteAlignment() > elementLayout.byteSize()

allocate

default MemorySegment allocate(MemoryLayout layout)
Возвращает новый сегмент памяти с заданным макетом.
Требования к реализации:
Реализация этого метода по умолчанию вызывает this.allocate(layout.byteSize(), layout.byteAlignment()).
Параметры:
layout — макет выделяемого блока памяти
Возвращает:
новый сегмент памяти с заданным макетом

allocate

default MemorySegment allocate(MemoryLayout elementLayout, long count)
Возвращает новый сегмент памяти с заданными elementLayout и count.
Требования к реализации:
Реализация этого метода по умолчанию вызывает this.allocate(MemoryLayout.sequenceLayout(count, elementLayout)).
Параметры:
elementLayout — макет элемента массива
count — количество элементов массива
Возвращает:
новый сегмент памяти с заданными elementLayout и count
Вызывает:
IllegalArgumentException — если elementLayout.byteSize() * count переполняется
IllegalArgumentException — если count < 0

allocate

default MemorySegment allocate(long byteSize)
Возвращает новый сегмент памяти с заданным byteSize.
Требования к реализации:
Реализация этого метода по умолчанию вызывает this.allocate(byteSize, 1).
Параметры:
byteSize — размер (в байтах) выделяемого блока памяти
Возвращает:
новый сегмент памяти с заданным byteSize
Вызывает:
IllegalArgumentException — если byteSize < 0

allocate

MemorySegment allocate(long byteSize, long byteAlignment)
Возвращает новый сегмент памяти с заданными byteSize и byteAlignment.
Параметры:
byteSize — размер (в байтах) выделяемого блока памяти
byteAlignment — выравнивание (в байтах) выделяемого блока памяти
Возвращает:
новый сегмент памяти с заданными byteSize и byteAlignment
Вызывает:
IllegalArgumentException — если byteSize < 0, byteAlignment <= 0 или если byteAlignment не является степенью двойки

slicingAllocator

static SegmentAllocator slicingAllocator(MemorySegment segment)
Возвращает аллокатор сегментов, который обрабатывает запросы на выделение, возвращая последовательные срезы, полученные из предоставленного сегмента. Каждый новый запрос на выделение возвращает новый срез, начинающийся с текущего смещения (с учётом дополнительного заполнения для соблюдения ограничения выравнивания) и имеющий заданный размер.

Возвращённый аллокатор вызывает IndexOutOfBoundsException, если невозможно получить срез предоставленного сегмента с запрошенными размером и выравниванием.

Примечание по реализации:
Аллокатор срезов не является потокобезопасным.
Параметры:
segment — сегмент, из которого должен создавать срезы возвращённый аллокатор
Возвращает:
новый аллокатор срезов
Вызывает:
IllegalArgumentException — если segment доступен только для чтения

prefixAllocator

static SegmentAllocator prefixAllocator(MemorySegment segment)
Возвращает аллокатор сегментов, который обрабатывает запросы на выделение, повторно используя один сегмент. Каждый новый запрос на выделение возвращает новый срез, начинающийся со смещения сегмента 0, отсюда и название префиксный аллокатор.

Эквивалентен следующему коду (но, вероятно, работает эффективнее):

MemorySegment segment = ...
SegmentAllocator prefixAllocator = (size, align) -> segment.asSlice(0, size, align);
Возвращённый аллокатор вызывает IndexOutOfBoundsException, если невозможно получить срез предоставленного сегмента с запрошенными размером и выравниванием.
Примечание API:
Префиксный аллокатор может быть полезен для ограничения запросов на выделение, если клиент знает, что полностью обработал содержимое выделенного сегмента до следующего запроса на выделение.
Примечание по реализации:
Хотя префиксный аллокатор является потокобезопасным, при одновременном доступе к одному и тому же повторно используемому аллокатору поток может перезаписать содержимое базового сегмента, записанное другим потоком.
Параметры:
segment — сегмент памяти, который будет повторно использоваться возвращённым аллокатором
Возвращает:
аллокатор, повторно использующий существующий сегмент при каждом новом запросе на выделение
Вызывает:
IllegalArgumentException — если segment доступен только для чтения

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её дочерних компаний в США и других странах.
Авторское право © 1993, 2025, Oracle и/или её дочерние компании, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 1993, 2025, 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/25/docs/api/java.base/java/lang/foreign/SegmentAllocator.html

Spec-Zone.ru

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