Есть ли способ получить логическую длину MemorySegment без выполнения байтовой арифметики?

Одним из больших преимуществ нового API FFM в Java 22 является класс MemoryLayout , который устраняет необходимость практически во всей байтовой арифметике. Однако есть еще одно место, где я не могу этого избежать: получение логического размера выделенного MemorySegment . Насколько я могу судить, единственный MemorySegment API, возвращающий объем выделенной памяти, — это оператор byteSize, который не принимает экземпляр MemoryLayout или ValueLayout. Итак, если у меня есть этот код:

Arena allocator = Arena.ofAuto();
ValueLayout.OfLong layout = ValueLayout.JAVA_LONG;
MemorySegment segment = allocator.allocate(layout, 100L);

Тогда единственный способ получить количество long, выделенных в сегменте, — это:

segment.byteSize() / layout.byteSize()

что немного неудовлетворительно, учитывая, насколько эффективно MemoryLayout устраняет подобную байтовую арифметику повсюду. Неужели нет другого пути?

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

VGR 19.06.2024 03:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
1
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете создать поток элементов, а затем вызвать count():

segment.elements(layout).count()

Обратите внимание: поскольку размер потока известен, count() является сокращенным, и ни один из элементов потока фактически не будет оценен.

Другие вопросы по теме