假设我有一个具有以下签名的方法:
public int indexOf(byte[] bytes, byte toFind, int offset, int length) {
...
}
此方法执行一些简单的操作,例如toFind
在 [offset, offset+length) in 范围内查找字节bytes
。我想预先检查偏移量和长度是否对bytes
. 也就是说,偏移量和偏移量+长度以字节为单位。
显式检查类似于:
if (offset < 0 || offset > bytes.length - length) {
throw ...; // bad santa!
}
似乎我可以通过执行“虚拟”数组访问来更便宜地执行此操作(就发出的字节码而言,也许还有运行时性能):
public int indexOf(byte[] bytes, byte toFind, int offset, int length) {
int dummy = bytes[offset] + bytes[offset + length - 1];
...
}
int dummy
如果可以的话,我想摆脱+
它们,或者降低它们的成本。编译器不喜欢独立访问bytes[offset];
,大概是因为这样的表达式通常没有副作用并且毫无意义(但在这种情况下并非如此)。使用 dummy int 还会导致必须抑制的编译器警告。
关于如何用最少的字节码进行更改的任何建议(运行时性能在这里也很重要,但我怀疑大多数解决方案都被优化为与丢弃未使用部分相同的东西)。