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

Сообщение Re[16]: А чего молчим про Crowdstrike от 26.07.2024 6:46

Изменено 29.07.2024 15:05 vdimas

Re[16]: А чего молчим про Crowdstrike
Здравствуйте, rameel, Вы писали:

R>И получаем идентичный выхлоп для всех 4 случаев


Ну какой идентичный, когда речь там шла о безопасности кода?

В случае Array диапазон достоверно берётся у объекта-контенера и код является абсолютно безопасным, ОК.
Но в случае Span этот диапазон может быть произвольным:
       int[] data = { 1, 2, 3};

       foreach(var i in data)
            Console.WriteLine(i);

       var span = MemoryMarshal.CreateSpan(ref data[0], data.Length + 1);

       foreach(var i in span)
            Console.WriteLine(i);


См., на что именно ты отвечаешь:

S>>Смотря как реализован доступ к массивам. Например, в дотнете это специальная инструкция байт-кода, за проверку в ней отвечает среда исполнения.
V>это не самый эффективный способ итерации по массивам


Т.е. способ итерации array[i], где i пробегает некий диапазон, не самый эффективный, хотя абсолютно надёжный.
(Синклер имел ввиду опкоды семейства ldelem_xxx, я отвечал на это)

И ты ведь показал итерацию по полному массиву.
А теперь проитерируйся по его части, посмотри разницу и помедитируй.

Теперь-то понятно, зачем сначала рекомендуется брать Span от массива и затем итерироваться?
Для итерации по полному массиву брать Span не требуется, конечно.

Мой поинт был в следующем:
— через Span эффективней (и все более и более популярней в реальном коде);
— но через Span можно залезть в произвольную память и наделать делов, в точности как в С++.
Re[16]: А чего молчим про Crowdstrike
Здравствуйте, rameel, Вы писали:

R>И получаем идентичный выхлоп для всех 4 случаев


Ну какой идентичный, когда речь там шла о безопасности кода?

В случае Array диапазон достоверно берётся у объекта-контейнера и код является абсолютно безопасным, ОК.
Но в случае Span этот диапазон может быть произвольным:
       int[] data = { 1, 2, 3};

       foreach(var i in data)
            Console.WriteLine(i);

       var span = MemoryMarshal.CreateSpan(ref data[0], data.Length + 1);

       foreach(var i in span)
            Console.WriteLine(i);


См., на что именно ты отвечаешь:

S>>Смотря как реализован доступ к массивам. Например, в дотнете это специальная инструкция байт-кода, за проверку в ней отвечает среда исполнения.
V>это не самый эффективный способ итерации по массивам


Т.е. способ итерации array[i], где i пробегает некий диапазон, не самый эффективный, хотя абсолютно надёжный.
(Синклер имел ввиду опкоды семейства ldelem_xxx, я отвечал на это)

И ты ведь показал итерацию по полному массиву.
А теперь проитерируйся по его части, посмотри разницу и помедитируй.

Теперь-то понятно, зачем сначала рекомендуется брать Span от массива и затем итерироваться?
Для итерации по полному массиву брать Span не требуется, конечно.

Мой поинт был в следующем:
— через Span эффективней (и все более и более популярней в реальном коде);
— но через Span можно залезть в произвольную память и наделать делов, в точности как в С++.