Я недавно читал эту статью Дэйва Детлефса, в которой он представляет несколько случаев, когда среда CLR выполняет исключение проверки границ массива. Я решил проверить это сам, поэтому сделал следующее:
Добавлен следующий код (все подметоды взяты непосредственно из статьи):
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; проверил, что в параметрах сборки отмечен флажок «Оптимизировать код»
Итак, вот разборка для 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 фактически не исключает проверку границ? Надеюсь, я ошибаюсь, и если да, то я хотел бы знать, как я действительно могу добиться исключения проверки границ массива.