2

this参照 (プライベート メソッドのorフィールドなど) を介して独自のインスタンス フィールドにアクセスすると、生成された Android Dalvik バイトコードにはバイトコード命令が含まれます。objectintiget

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に事前設定できるということです(基本ブロック間の遷移中でも値をクリアする必要はありません)。

4

1 に答える 1

1

バイトコードの観点からは、「this」オブジェクトのフィールドへのアクセスは、他のオブジェクトのフィールドへのアクセスと同じです。「this」参照を含むレジスタを渡す必要があります。渡されるレジスタが実際に null 以外の値を含むことを保証する方法がないため、他のオブジェクトと同様に、null かどうかのチェックを実行する必要があります。

于 2013-04-20T02:04:47.047 に答える