2012-02-20 8 views
5

Usamos struct en C# siempre que sea posible, principalmente porque se almacena en la pila y no se crean objetos para ella. Esto aumenta el rendimiento.Si una matriz se usa como un elemento en struct (C#), ¿dónde está almacenada?

Por otro lado, los arrays se almacenan en el montón.

Mi pregunta es, si incluyo una matriz como un elemento de la estructura, algo de la siguiente manera:

struct MotionVector 
{ 
    int[] a; 
    int b; 
} 

Entonces lo que serán las consecuencias. ¿Se almacenará esa matriz en la pila? ¿O la ventaja de rendimiento de usar struct se perderá?

+2

http://stackoverflow.com/questions/3942721/c-structs-versus-classes –

+1

¿Tiene problemas reales de rendimiento? Consulte http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx – ken2k

+0

http://stackoverflow.com/a/1114152/55209 - Una excelente explicación –

Respuesta

0

Si no desea crear elementos de forma dinámica, considere crear una (gran) Tampón de instancias MotionVector durante el inicio y la reutilización de los cuando sea necesario. Entonces no obtendrás la penalización de crear/destruirlos dinámicamente.

Por supuesto, usted tiene que escribir algunas pequeñas funciones para obtener una instancia de 'libre' ya obtener uno, utilice un valor lógico de la estructura para que (o mediante el uso de una interfaz).

Para hacer esto usted podría por ejemplo:

Crear durante la inicialización de la aplicación de los motionvectors:

MotionVectors motionVectors; 

Añadir un booleano a la clase MotionVector:

public class MotionVector 
{ 
    bool InUse { get; set; } 

    public MotionVector() 
    { 
     InUse = false; 
    } 
} 

definir la nueva clase MotionVectors:

class MotionVectors 
{ 
    MotionVector _instances[100]; 

    public void Free(MotionVector vector) 
    { 
     var index = 'search vector in _instances' 
     _instances[index].Inuse = false; 
    } 

    public MotionVector GetNewInstance() 
    { 
     var index = 'first free vector in _instances' 
     _instances[index].Inuse = true; 
     return _instances[index]; 
    } 
} 
+0

esto parece ser una muy buena idea. Muchas gracias. ¿Puedes señalar algunos ejemplos sobre cómo hacerlo? – shahensha

+0

Me temo que no tengo ejemplos reales, sin embargo, adaptaré mi respuesta un poco. –

+0

Muchas gracias @Michel – shahensha

8

Solo el puntero a la matriz se almacenará en la pila. La matriz real se almacenará en el montón.

1

int[] a es un tipo de referencia es decir, se hace referencia a una matriz de enteros. La 'referencia' en sí misma se almacenará en la pila. Sin embargo, los datos de TI referencias serán almacenados en el montón cuando se hace algo como esto:

MotionVector z; 
z.a = new int[10]; 
1

le pedirá que contenga una referencia a una en su estructura; eso será parte de la estructura en la pila.

El int real [] objetos, si/cuando lo inicialice, irá donde quiera que iría en caso contrario (el montón en la mayoría de las arquitecturas).

Cuestiones relacionadas