@azyobuzinの技術ブログ

null かどうかわからない配列にアクセスするメソッドを用意する。

public int M(int[] bs) {
    return bs[5];
}

これをリリースビルドして、 JIT コンパイル結果を見ると、配列長のチェックはしているが、そもそも bsnull かどうかについては一切調べていない。

L0000: cmp dword [edx+0x4], 0x5
L0004: jbe L000a
L0006: mov eax, [edx+0x1c]
L0009: ret
L000a: call 0x739a3140
L000f: int3

https://sharplab.io/#v2:C4LghgzgtgPgAgZgARwExIMJIN4FgBQSRKyAlgHbBICyAFBcANoC6SARhAJQ4HF8oB2dhEYBWZgG5exAL4EZQA==
(SharpLab 強すぎる)

この場合、仮想メモリアドレス 0x4 にアクセスした時点でアクセス違反(Windows では 0xFFFF まで VirtualAlloc できない)となるはずなので、 CLR の null チェックは CPU の例外に頼っていると思われる。その場合、 null を踏み抜かない限り、チェックにコストはかかっていないということになる。

CoreCLR のソースのコメントとか読めばもっと詳しいこと書いてあるのかな?調べる体力は残ってない。

このログへのコメント

コメントはありません