2011-08-04 8 views
57

¿Cuál es el equivalente C# del vector C++?C# equivalente del vector C++, con memoria contigua?

Busco para esta función:

Para tener una matriz dinámica de memoria contigua almacenado que no tiene ninguna penalización en el rendimiento para el acceso vs. matrices estándar.

que estaba buscando y dicen .NET equivalent to the vector in C++ is the ArrayList, por lo que:

Do ArrayList tiene esa característica de memoria contigua?

+4

no es el CLR suficientemente cerca al metal para que especifique (o incluso consistentemente esperar) cómo una estructura es asignada en la memoria? – Aphex

Respuesta

68

Puede utilizar un List<T> y cuando T es un tipo de valor que se asignará en la memoria contigua, que no sería el caso si T es un tipo de referencia.

Ejemplo:

List<int> integers = new List<int>(); 
integers.Add(1); 
integers.Add(4); 
integers.Add(7); 

int someElement = integers[1]; 
+1

¿Podría mencionar algún ejemplo? – cMinor

+2

@cMinor, la documentación de la clase 'List ' contiene muchos ejemplos pero he actualizado mi respuesta para incluir una. –

+4

No estoy 100% familiarizado con el CLR, pero tiene sentido que incluso si 'T' es un tipo de referencia, usted todavía tendrá memoria contigua. Básicamente es una matriz de punteros ... – josaphatv

14

uso List<T>. Internamente, utiliza matrices y matrices que usan memoria contigua.

+6

+1. ¿Por qué la gente insiste en mencionar incluso 'ArrayList'? –

+1

No es del todo cierto. Si T es un tipo de referencia, no habrá memoria contigua. –

+2

@Matteo si nos fijamos en la fuente, hay '[] _items T privadas;' que se utiliza para el almacenamiento de back-end, tipo de referencia o no. –

12

C# tiene muchos tipos de referencia. Incluso si un contenedor almacena las referencias forma contigua, los objetos mismos pueden estar dispersos a través del montón

12

En primer lugar, se mantenga alejado de Arraylist o Hashtable. Esas clases se deben considerar obsoletas, a favor de los genéricos. Todavía están en el idioma para fines heredados.

Ahora, lo que estás buscando es la clase List<T>. Tenga en cuenta que si T es un tipo de valor, tendrá memoria contigua, pero no si T es un tipo de referencia, por razones obvias.