Java 21 中没有边界检查的 Java 外部内存段的 VarHandle

问题描述 投票:0回答:1

我正在尝试从 Java 17 更新到 21,但我对

VarHandle
中的
java.lang.foreign
有问题。我使用
 获得内存段 
VarHandle

VarHandle varhandle = layout.varHandle(path)

但是此方法包括对 SequenceLayouts 和 IndexOutOfBounds 异常进行边界检查。 除此之外,我需要与 Java 17 中相同的行为。

如何关闭它?

更新: 我需要适用于任何 SequenceLayout 的方法

例如:

var innerLayout = MemoryLayout.structLayout(
  MemoryLayout.sequenceLayout(5, ValueLayout.JAVA_LONG).withName("a"),
  ValueLayout.JAVA_INT.withName("b"),
)

var layout = MemoryLayout.structLayout(
  MemoryLayout.sequenceLayout(n, innerLayout).withName("x"),
  MemoryLayout.sequenceLayout(m, innerLayout).withName("y"),
)

var xVarHandle = layout
  .varHandle(PathElement.groupElement("x"), PathElement.sequenceElement(), PathElement.groupElement("a"), PathElement.sequenceElement())

var yVarHandle = layout
  .varHandle(PathElement.groupElement("y"), PathElement.sequenceElement(), PathElement.groupElement("a"), PathElement.sequenceElement())
java memory java-21 varhandle java-ffm
1个回答
0
投票

你陷入了AB问题; “关闭边界检查”不是一回事。可能发生的情况是您的 VH 调用没有被内联,可能是因为 Jorn 的评论中概述的原因:

如果您看到使用采样分析器调用 checkCustomized,那么看起来 VarHandle 并未被优化掉。确保您的 VarHandle 实例是常量,例如将它们存储在静态最终字段中并从那里使用。

© www.soinside.com 2019 - 2024. All rights reserved.