Spec-Zone.ru › OpenJDK 24

Интерфейс 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)
Возвращает новый сегмент памяти, инициализированный заданным байтовым значением.
default MemorySegment allocateFrom(ValueLayout.OfByte elementLayout, byte... elements)
Возвращает новый сегмент памяти, инициализированный элементами в предоставленном массиве байтов.
default MemorySegment allocateFrom(ValueLayout.OfChar layout, char value)
Возвращает новый сегмент памяти, инициализированный заданным символом.
default MemorySegment allocateFrom(ValueLayout.OfChar elementLayout, char... elements)
Возвращает новый сегмент памяти, инициализированный элементами в предоставленном массиве символов.
default MemorySegment allocateFrom(ValueLayout.OfDouble layout, double value)
Возвращает новый сегмент памяти, инициализированный заданным двойным значением.
default MemorySegment allocateFrom(ValueLayout.OfDouble elementLayout, double... elements)
Возвращает новый сегмент памяти, инициализированный элементами в предоставленном массиве двойных значений.
default MemorySegment allocateFrom(ValueLayout.OfFloat layout, float value)
Возвращает новый сегмент памяти, инициализированный заданным плавающим значением.
default MemorySegment allocateFrom(ValueLayout.OfFloat elementLayout, float... elements)
Возвращает новый сегмент памяти, инициализированный элементами в предоставленном массиве плавающих значений.
default MemorySegment allocateFrom(ValueLayout.OfInt layout, int value)
Возвращает новый сегмент памяти, инициализированный заданным целочисленным значением.
default MemorySegment allocateFrom(ValueLayout.OfInt elementLayout, int... elements)
Возвращает новый сегмент памяти, инициализированный элементами в предоставленном целочисленном массиве.
default MemorySegment allocateFrom(ValueLayout.OfLong layout, long value)
Возвращает новый сегмент памяти, инициализированный заданным длинным значением.
default MemorySegment allocateFrom(ValueLayout.OfLong elementLayout, long... elements)
Возвращает новый сегмент памяти, инициализированный элементами в предоставленном массиве длинных значений.
default MemorySegment allocateFrom(ValueLayout.OfShort layout, short value)
Возвращает новый сегмент памяти, инициализированный заданным коротким значением.
default MemorySegment allocateFrom(ValueLayout.OfShort elementLayout, short... elements)
Возвращает новый сегмент памяти, инициализированный элементами в предоставленном массиве коротких значений.
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 - размер (в байтах) символа-завершителя в соответствии с предоставленной кодировкой. Например, это 1 для StandardCharsets.US_ASCII и 2 для StandardCharsets.UTF_16.
Параметры:
str - строка Java, которая должна быть преобразована в строку C
charset - кодировка, используемая для кодирования байтов строки
Возвращает:
новый собственный сегмент, содержащий преобразованную строку C
Исключения:
IllegalArgumentException - если charset не является стандартной кодировкой

allocateFrom

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

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

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

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)
Возвращает новый сегмент памяти, инициализированный элементами предоставленного массива байтов.

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

Требования к реализации:
Реализация по умолчанию для этого метода эквивалентна следующему коду:
 this.allocateFrom(layout, MemorySegment.ofArray(array),
                   ValueLayout.JAVA_BYTE, 0, array.length)
Параметры:
elementLayout - макет элемента массива, который нужно выделить
elements - байтовые элементы, которые нужно скопировать в новый выделенный блок памяти
Возвращает:
новый сегмент памяти, инициализированный элементами предоставленного массива байтов
Исключения:
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 является только для чтения

© 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/foreign/SegmentAllocator.html

Spec-Zone.ru

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