Я хочу создать класс, который по сути представляет собой массив фиксированного размера с некоторыми функциями.
Это будет сделано так:
private class SomeClass : SomeSuperClass {
private readonly SomeType[] children = new SomeType[256];
...
}
Теперь это будет работать логично. Но я думаю, что это сделает массив отдельным объектом кучи, чего я не хочу.
Я бы предпочел, чтобы он вел себя так, как если бы я делал на C++ следующее:
class SomeClass : SomeSuperClass {
SomeType children[256];
...
}
Есть ли какой-нибудь способ сделать это на C# или мне нужно полагаться на свой компилятор, чтобы оптимизировать это?
Это не большая проблема, но меня это беспокоит, и я не смог ничего найти по этому поводу самостоятельно.
См. встроенные массивы.
@EtiennedeMartel, спасибо, это то, что я искал. При поиске буквально «встроенного массива C#» я мог найти только информацию о синтаксисе.
Обратите внимание: если вы объявляете структуру встроенного массива, а затем помещаете эту структуру в класс, при создании экземпляра этого класса встроенный массив все равно будет помещен в кучу. Это должны быть «структуры до конца», чтобы гарантировать, что все находится в стеке.
@MatthewWatson, насколько я понимаю, ОП хотел бы только избежать дополнительного выделения кучи для массива внутри класса («Но я думаю, что это сделает массив отдельным объектом кучи, чего я не хочу»).
Как прокомментировал @EtiennedeMartel, для этого вы можете использовать встроенный массив :
Встроенные массивы используются командой выполнения и другими авторами библиотек. для повышения производительности ваших приложений. Встроенные массивы позволяют разработчику создать массив фиксированного размера в типе структуры. Структура с встроенный буфер должен обеспечивать характеристики производительности, аналогичные небезопасный буфер фиксированного размера.
Пример в вашем случае:
[System.Runtime.CompilerServices.InlineArray(256)]
public struct ChildrenArray
{
private SomeType _element0;
}
private class SomeClass : SomeSuperClass {
private readonly ChildrenArray children = new ChildrenArray();
//...
}
children[i]
даст вам доступ к i
-му элементу, как и в обычном массиве.
Примечание. Он доступен начиная с C# 12.
Невозможно сделать это без небезопасного буфера до C# 12, верно?
Насколько я знаю, нет.
До C# 12 можно было использовать буферы фиксированного размера, но для них требуется небезопасный код. В частности, для доступа к элементам буфера необходимо использовать указатели. Тип встроенного массива неявно преобразуется в диапазон, поэтому их по своей сути проще использовать (и не требуется unsafe
).
Для меня это звучит как преждевременная оптимизация