Возможны ли массивы на основе стека в C #? - PullRequest
6 голосов
/ 16 марта 2010

Скажем, гипотетически (читай: я не думаю, что мне это действительно нужно, но мне любопытно, как эта идея пришла мне в голову), кто-то хотел выделить массив памяти локально в стеке, а не в куче , Например, что-то вроде этого:

private void someFunction()
{
    int[20] stackArray; //C style; I know the size and it's set in stone
}

Полагаю, ответ - нет. Все, что я смог найти, это массивы на основе кучи. Если кому-то это понадобится, будут ли какие-то обходные пути? Есть ли способ выделить определенное количество последовательной памяти в «тип значения»? Или структуры с именованными параметрами - единственный путь (как, например, * * * * * * * * * Матрица в XNA имеет 16 именованных параметров (M11-M44))?

Ответы [ 2 ]

4 голосов
/ 16 марта 2010

То, что вы хотите, это stackalloc; к сожалению, вы можете использовать это только в небезопасном коде, что означает, что он не будет работать в контексте ограниченных прав доступа.

Вы также можете создать структуру с необходимым количеством переменных для каждого типа элемента, но вам потребуется новый тип для каждого размера «массива», который вы хотите использовать

0 голосов
/ 01 августа 2011

Наиболее близкая вещь, которую я могу придумать к массиву на основе стека, - это структура, вложенная вручную; для массива размером N ^ M размер кода будет O (MN) и время доступа O (M); можно масштабировать M и N так, как это удобно (например, можно обрабатывать массив из 4096 элементов в виде вложенных четырехэлементных структур с шестью глубинами, вложенных четырехэлементных структур с четырьмя глубинами или вложенных 16-элементных структур с тремя глубинами, вложенных с двумя глубинами) 64-элементные структуры и т. Д.) Если кто-то хочет вложить вложенные массивы из 16 элементов в три глубины (вероятно, наиболее практичный компромисс), можно определить структуру из 16 элементов с полями от f0 до f15 и метод доступа, использующий переключатель / чехол, чтобы выбрать элемент. Затем можно определить структуру из 16 элементов, структуру из 16 элементов и т. Д.

Как правило, использование стандартного массива лучше, чем использование структур типа значения для имитации массивов, но бывают случаи, когда использование массива в качестве типа значения было бы выгодно. Преимущества массивов типов значений, как правило, ограничены в .net, однако, некоторыми ограничениями в обработке типов значений посредством ссылки. Хотя было бы неплохо, если бы можно было просто получить доступ к элементу 0x123 из массива, описанного выше, написав «MyArrayishThing [1] [2] [3]», это было бы неэффективно для чтения и неэффективно для записи (так как подвыражение MyArrayishThing [1 ] создаст копию структур, содержащих 256 элементов массива). Вместо этого необходимо передать MyArrayishThing [1] со ссылкой на процедуру, которая может получить доступ к элементу 2 этого элемента, и передать его посредством ссылки на процедуру, чтобы получить доступ к элементу 3 этого элемента. Это можно сделать эффективно, но код выглядит довольно неприятно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...