this参照 (プライベート メソッドのorフィールドなど) を介して独自のインスタンス フィールドにアクセスすると、生成された Android Dalvik バイトコードにはバイトコード命令が含まれます。object
int
iget
iget v2, p0, Lcom/example/myapp/MyClass;->status:I
これは、別のオブジェクトのフィールドに (つまり、ポインター経由ではなく) アクセスするときに発行される命令と同じであるthis
ため、他のオブジェクトと自分自身を区別していないようです。バイトコードではこれは理解できますが、JIT はさらに多くのことを行うことができます。
Android のソース コードを確認したところ、このような場合 (つまり、this
. すでにnullチェックされたDalvikレジスタの基本ブロックでは削除されますが、(私にとっては)this
アクセスのために削除することもできるようです(たとえそれが基本ブロックの最初の命令であっても、または任意の命令であっても、this
できません) null であること)。
私は何が欠けていますか?セキュリティ/ランタイムのタイプセーフの理由ですか? それとも、単にソース コードを見落としているのでしょうか。VM (JIT)this
が際立った方法で処理できないのはなぜですか? this
(他のものと同じようにメモリアドレスであるため、ネイティブコードは明らかにできないことを理解しています。)
編集:私が見る限り、dvm で基本ブロックが終了するたびに、「既に null チェック済み」フラグがクリアされます。私が言っているのは、これを保持するレジスタの「すでにヌルチェック済み」フラグを1に事前設定できるということです(基本ブロック間の遷移中でも値をクリアする必要はありません)。