2

当您通过this引用访问自己的实例字段时(例如,来自私有方法的or字段),生成的 Android Dalvik 字节码将包含一个字节码指令:objectintiget

iget v2, p0, Lcom/example/myapp/MyClass;->status:I

这是当您访问另一个对象的字段(即不是通过this指针)时发出的相同指令,因此它似乎无法区分其他对象和您自己。在字节码中,这是可以理解的,但 JIT 可以做得更多。

检查Android源代码,我没有看到JIT会自动消除这种情况下的空检查(即当您访问时this)。它在已经空检查的 Dalvik 寄存器的基本块中被消除,很好,但是(对我来说)它似乎也可以被消除this访问(即使它是基本块的第一条指令,或任何指令,因为this不能为空)。

我错过了什么?是出于安全/运行时类型安全的原因吗?或者我只是忽略了源代码?为什么 VM (JIT) 不能this以独特的方式处理?(我理解本机代码显然不能,因为this内存地址就像其他任何东西一样。)


编辑:据我所见,每次基本块在 dvm 中结束时,都会清除“已检查空”标志。我要说的是,保存的寄存器的“已检查空”标志可以预先设置为 1(即使在基本块之间的转换期间也不需要清除该值)。

4

1 回答 1

1

从字节码的角度来看,访问“this”对象上的字段与访问任何其他对象上的字段没有什么不同——您仍然必须传入一个包含“this”引用的寄存器。由于无法保证传入的寄存器实际上包含非空值,因此它仍然必须执行空性检查,就像对任何其他对象一样。

于 2013-04-20T02:04:47.047 回答