Устранение проверки границ массива в CLR?

Я недавно читал эту статью Дэйва Детлефса, в которой он представляет несколько случаев, когда среда CLR выполняет исключение проверки границ массива. Я решил проверить это сам, поэтому сделал следующее:

  • Открыл Visual Studio 2010 U ltimate SP1
  • Создан новый проект C # типа Console Application (по умолчанию ориентирован на профиль клиента .NET 4)
  • Добавлен следующий код (все подметоды взяты непосредственно из статьи):

     class Program {
    static void Main (string [] args) {
    int [] массив = новый int [30];
    Test_SimpleAscend (массив);
    Test_SimpleRedundant (массив, 3);
    
    foreach (int i в массиве) {
    Консоль.WriteLine (i);
     }
     }
    
    static void Test_SimpleAscend (int [] a) {
    для (int i = 0; i 
  • Переключен в режим Release; проверил, что в параметрах сборки отмечен флажок «Оптимизировать код»

  • . Добавлена ​​точка останова для каждого доступа к массиву, начата отладка (F5) и открыто окно «Разборка»

Итак, вот разборка для a [i] = i; in 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 

Вызов cmp / jb / является проверкой границ, фактически принудительное выполнение вызова вызывает исключение IndexOutOfRangeException.

То же самое для всех обращений к массиву, включая избыточный доступ в Test_SimpleRedundant. Так что-то не так с моей методологией тестирования, или CLR фактически не исключает проверку границ? Надеюсь, я ошибаюсь, и если да, то я хотел бы знать, как я действительно могу добиться исключения проверки границ массива.

5
задан leventov 11 February 2014 в 17:48
поделиться