tgoop.com/csharp_gepard/80
Create:
Last Update:
Last Update:
Массив на стеке #решение #память
С момента появления InlineArrayAttribute (мотивация) я хотел на него посмотреть в деле. Напомню, что это атрибут для структур, который "размножает" поле, в котором лежит "элемент массива". Также, атрибут добавляет индексатор для доступа к значениям, чтобы структура стала похожей на массив. Значения через индексатор попадают в сгенерированные поля, откуда могут быть получены позже.
И это всё на стеке, т.е. тот самый zero-allocation.
[System.Runtime.CompilerServices.InlineArray(10)]
public struct Buffer10
{
private int _element0;
}
Единственная проблема: по поведению это массив, т.е. не List, который может расширяться. Это накладывает определённые ограничения на применение данной фичи. Конечно, выход существует и его придумали давно (см. тут): при достижении предела локальных полей мы создаём честный массив, куда складываем "избыток" значений.
С появлением InlineArray эти два подхода можно объединить. Получается неплохо: и быстрее и экономнее по памяти. Кода много, поэтому он тут.
Представить InlineArray как
Span
тоже просто - Span<int> span = myBuffer
. Это позволит применить любые подходы работы со Span для всех структур, отмеченных InlineArrayAttribute
.BY C# Heppard

Share with your friend now:
tgoop.com/csharp_gepard/80