2010-03-16 11 views
6

Digamos, hipotéticamente (léase: no creo que realmente lo necesite, pero siento curiosidad cuando la idea me vino a la cabeza), uno quería una gran cantidad de memoria guardada localmente en la pila, no en el montón. Por ejemplo, algo como esto:¿Son posibles las matrices basadas en la pila en C#?

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

Supongo que la respuesta es no. Todo lo que he podido encontrar son matrices basadas en montones. Si alguien necesitara esto, ¿habría alguna solución? ¿Hay alguna manera de apartar una cierta cantidad de memoria secuencial en una forma de "tipo de valor"? ¿O son las estructuras con parámetros nombrados la única forma (como la forma en que el Matrix struct en XNA tiene 16 parámetros nombrados (M11-M44))?

Respuesta

4

Lo que quiere es stackalloc; desafortunadamente, solo puedes usar esto en un código inseguro, lo que significa que no se ejecutará en un contexto de permisos limitados.

También podría crear una estructura con el número necesario de variables en que para cada tipo de elemento, pero que se necesita un nuevo tipo para cada tamaño de 'array' que querían usar

+0

Hm, ¿qué tal un LinkedList primitivo? En su struct set struct anterior/siguiente del mismo tipo ... no obtiene la semántica de ICollection, pero podría ser suficiente para IEnumerable ... – flq

+0

Gracias por la respuesta. Sí, ¿son posibles LinkedLists basadas en struct? ¿Y tienes una idea de por qué no hay una opción de matriz basada en pila segura en .NET? – Bob

+0

@Frank: No puede hacer esto: cuando intento compilar una estructura recursiva, obtengo un 'CS0523: miembro de Struct provoca un ciclo en el diseño de la estructura' – thecoop

0

Lo más parecido que puede pensar en una matriz basada en pila sería una estructura anidada manualmente; para una matriz de tamaño N^M, el tamaño del código sería O (MN) y el tiempo de acceso O (M); uno podría escalar M y N como conveniente (por ejemplo, uno podría manejar una matriz de 4096 elementos como estructuras de 4 elementos anidados de seis profundidades, estructuras de 8 elementos anidados de cuatro profundidades o estructuras de 16 elementos anidados de tres profundidades, anidados de dos profundidades Estructuras de 64 elementos, etc.). Si uno quisiera hacer una anidación de tres profundidades de arreglos de 16 elementos (probablemente la solución más práctica) uno definiría una estructura de 16 elementos con los campos f0 a f15, y un método de acceso usando interruptor/caja para seleccionar un elemento. Entonces uno podría definir una estructura de 16 elementos, una estructura de 16 elementos, etc.

En general, usar una matriz estándar es mejor que usar estructuras de tipo valor para imitar matrices, pero hay Son momentos en los que tener una cosa de matriz como un tipo de valor sería ventajoso. Las ventajas de las matrices de tipo de valor tenderían a ser limitadas en .net, sin embargo, debido a algunas limitaciones en su manejo de la manipulación de tipos de valores por referencia. Si bien sería bueno si uno pudiera simplemente acceder al elemento 0x123 desde una matriz descrita arriba escribiendo "MiArreglo [1] [2] [3]", eso sería ineficaz para la lectura e ineficaz para la escritura (ya que la subexpresión MyArrayishThing [1] ] haría una copia de estructuras con 256 elementos de la matriz). En cambio, lo que es necesario es pasar MyArrayishThing [1] por referencia a una rutina que puede acceder al elemento 2 de eso y pasarlo por referencia a una rutina para acceder al elemento 3 de eso. Es posible hacerlo de manera eficiente, pero el código termina siendo bastante desagradable.

Cuestiones relacionadas