Сообщение Re[3]: Отключение проверки выхода за границы массива от 11.01.2021 10:09
Изменено 11.01.2021 10:10 alexzzzz
Re[3]: Отключение проверки выхода за границы массива
Здравствуйте, Sharov, Вы писали:
R>>Все это справедливо только, если работаешь с локальной переменной или аргументом метода. В этом случае, джит уверен, что никто не изменит ссылку из вне метода, в остальном случае — гарантий нет, и джит вставит проверки на выход за границы массива
S>А как jit убедиться, что никто не изменит аргумент в вызывающем коде? Всяческая многопоточность и т.д.
Содержимое массива может меняться, но длина массива не может.
С вариантом, когда массив локальный, ведь тоже не всё здорово:
Внутри Bar() ссылка на массив могла где-то дополнительно сохраниться и успеть прочитаться другими потоками, которые могут начать менять содержимое массива одновременно с циклом внутри Foo(). Но поскольку длина массива измениться не может, проверки на выход за границы можно убрать.
R>>Все это справедливо только, если работаешь с локальной переменной или аргументом метода. В этом случае, джит уверен, что никто не изменит ссылку из вне метода, в остальном случае — гарантий нет, и джит вставит проверки на выход за границы массива
S>А как jit убедиться, что никто не изменит аргумент в вызывающем коде? Всяческая многопоточность и т.д.
Содержимое массива может меняться, но длина массива не может.
С вариантом, когда массив локальный, ведь тоже не всё здорово:
void Foo()
{
var a = new int[10];
Bar(a);
for (int i = 0; i < a.Length; i++)
{
...
}
}
Внутри Bar() ссылка на массив могла где-то дополнительно сохраниться и успеть прочитаться другими потоками, которые могут начать менять содержимое массива одновременно с циклом внутри Foo(). Но поскольку длина массива измениться не может, проверки на выход за границы можно убрать.
Re[3]: Отключение проверки выхода за границы массива
Здравствуйте, Sharov, Вы писали:
R>>Все это справедливо только, если работаешь с локальной переменной или аргументом метода. В этом случае, джит уверен, что никто не изменит ссылку из вне метода, в остальном случае — гарантий нет, и джит вставит проверки на выход за границы массива
S>А как jit убедиться, что никто не изменит аргумент в вызывающем коде? Всяческая многопоточность и т.д.
Длина массива не может меняться. С вариантом, когда массив локальный, ведь тоже не всё здорово:
Внутри Bar() ссылка на массив могла где-то дополнительно сохраниться и успеть прочитаться другими потоками, которые могут начать менять содержимое массива одновременно с циклом внутри Foo().
R>>Все это справедливо только, если работаешь с локальной переменной или аргументом метода. В этом случае, джит уверен, что никто не изменит ссылку из вне метода, в остальном случае — гарантий нет, и джит вставит проверки на выход за границы массива
S>А как jit убедиться, что никто не изменит аргумент в вызывающем коде? Всяческая многопоточность и т.д.
Длина массива не может меняться. С вариантом, когда массив локальный, ведь тоже не всё здорово:
void Foo()
{
var a = new int[10];
Bar(a);
for (int i = 0; i < a.Length; i++)
{
...
}
}
Внутри Bar() ссылка на массив могла где-то дополнительно сохраниться и успеть прочитаться другими потоками, которые могут начать менять содержимое массива одновременно с циклом внутри Foo().