Информация об изменениях

Сообщение Re[3]: Отключение проверки выхода за границы массива от 11.01.2021 10:09

Изменено 11.01.2021 10:10 alexzzzz

Re[3]: Отключение проверки выхода за границы массива
Здравствуйте, Sharov, Вы писали:

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 убедиться, что никто не изменит аргумент в вызывающем коде? Всяческая многопоточность и т.д.


Длина массива не может меняться. С вариантом, когда массив локальный, ведь тоже не всё здорово:
void Foo()
{
    var a = new int[10];
    Bar(a);
    for (int i = 0; i < a.Length; i++)
    {
        ...
    }
}


Внутри Bar() ссылка на массив могла где-то дополнительно сохраниться и успеть прочитаться другими потоками, которые могут начать менять содержимое массива одновременно с циклом внутри Foo().