我正在尝试从 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())
你陷入了AB问题; “关闭边界检查”不是一回事。可能发生的情况是您的 VH 调用没有被内联,可能是因为 Jorn 的评论中概述的原因:
如果您看到使用采样分析器调用 checkCustomized,那么看起来 VarHandle 并未被优化掉。确保您的 VarHandle 实例是常量,例如将它们存储在静态最终字段中并从那里使用。