Одним из больших преимуществ нового 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 устраняет подобную байтовую арифметику повсюду. Неужели нет другого пути?




Вы можете создать поток элементов, а затем вызвать count():
segment.elements(layout).count()
Обратите внимание: поскольку размер потока известен, count() является сокращенным, и ни один из элементов потока фактически не будет оценен.
Я не думаю, что есть. Действительно, вы можете (а иногда и должны) изменить предполагаемый размер сегмента. Вот почему вы сохраняете соответствующий MemoryLayout при работе с MemorySegment.