Array Bounds Check Elimination no CLR?
Eu estava lendo recentementeEste artig por Dave Detlefs, no qual ele apresenta alguns casos em que o CLR executa a eliminação de verificação de limites de matriz. Decidi testar isso sozinho, então fiz o seguinte:
Opened Visual Studio 2010 Ultimate SP1riou um novo projeto C # do tipo Aplicativo de Console (direcionado ao .NET 4 Client Profile por padrãAdicionou o seguinte código (todos os sub-métodos são obtidos diretamente do artigo):
class Program {
static void Main(string[] args) {
int[] array = new int[30];
Test_SimpleAscend(array);
Test_SimpleRedundant(array, 3);
foreach (int i in array) {
Console.WriteLine(i);
}
}
static void Test_SimpleAscend(int[] a) {
for (int i = 0; i < a.Length; i++)
a[i] = i;
}
static void Test_SimpleRedundant(int[] a, int i) {
int k = a[i];
k = k + a[i];
}
}
Alterado para o modo Release; verificou que "Otimizar código" está marcado nas opções de compilação
Adicionou um ponto de interrupção para cada acesso ao array, iniciou a depuração (F5) e abriu a janela de desmontagemEntão aqui está a desmontagem para a [i] = i; em Test_SimpleAscend:
a[i] = i;
00000024 mov eax,dword ptr [ebp-4]
00000027 mov edx,dword ptr [ebp-8]
0000002a cmp eax,dword ptr [edx+4]
0000002d jb 00000034
0000002f call 64FD6E08
00000034 mov ecx,dword ptr [ebp-4]
00000037 mov dword ptr [edx+eax*4+8],ecx
A chamada cmp / jb / está dentro dos limites, forçando a chamada a ser executada lança uma IndexOutOfRangeExceptio
O mesmo para todos os acessos à matriz, incluindo o acesso redundante em Test_SimpleRedundant. Então, há algo errado com minha metodologia de teste ou o CLR não elimina a verificação de limites? Espero estar errado e, se assim for, gostaria de saber como posso realmente obter limites de matriz verificando a eliminaçã