2012-01-19 13 views
6

Hola a todos cuando escribo una implementación de lista de matriz, entiendo que es importante establecer Item(x) en nulo cuando se elimina (en lugar de simplemente quantity -= 1) para evitar pérdidas de memoria.¿Las matrices de primitivas "distintas de cero" requieren más memoria?

Sin embargo, si mi lista de arreglos es una lista de arreglos primitivos (respaldada por int[]), ¿tiene sentido establecerla en 0?

Del mismo modo, para una lista de matrices de caracteres primitivos (respaldados por un char[]), cuando se invoca RemoveRange(), ¿tiene sentido llenar ese rango con \u0000? ¿O está totalmente bien simplemente actualizar el length y los punteros sin modificar la matriz de respaldo?

es una matriz de enteros llenos de ceros posiblemente menos memoria que ocupa de una matriz de longitud igual lleno de valores enteros debido a que el tiempo de ejecución podría hacer optimizaciones?

+0

Si no recuerdo mal, la respuesta a esta pregunta es un poco ilógico. Dejaré que alguien más inteligente haga la explicación solo porque mi memoria es demasiado confusa sobre el tema. – Esko

+0

Es muy tentador confirmar falsamente que un int [] se vuelve más grande cuanto mayores son los números que uno posee. ¿Algunas personas no tienen un modelo de cómo funciona una computadora? – Ingo

+0

optimizaciones @Ingo que pensaba podrían hacerse si todos fueran el mismo valor (es decir, 0) – Pacerier

Respuesta

7

¿Hay una matriz de entradas llena de ceros posiblemente ocupando menos memoria que una matriz de igual longitud llena de valores enteros?

Suponiendo que en ambos casos se trata de un int[] - no. Dos matrices del mismo tipo y la misma longitud siempre ocuparán la misma cantidad de memoria.

No hay necesidad para sobrescribir los elementos de la matriz "ahora vacías" con 0. No haría ningún daño (más allá de una pequeña ventaja de rendimiento), e incluso puede hacer las cosas más simples cuando la depuración, pero no lo hacen Necesitar.

1

No, no es necesario hacerlo con tipos primitivos (es decir, establecerlos en 0) ya que la única razón por la que las "ranuras" están explícitamente anuladas son para evitar falsas referencias a ellos y por lo tanto se atornilla con la recolección de elementos no utilizados.

1

No puede tener un ArrayList<int> ni ninguna otra clase de contenedor con elementos primitivos. Con respecto a las matrices simples, vea la respuesta de Jon Skeets.

+1

Estoy bastante seguro de que él sabe eso y quiere crear su propia clase 'ArrayList' no genérica como' IntArrayList'. –

+0

+ Sanjay - No estoy tan seguro. De todos modos, se supone que no debo responder lo que alguien podría haber querido decir, sino responder lo que él me preguntó. – Ingo

+1

Lo leí mientras implementaba su propia lista de arreglos (no usando ArrayList). – wmorrison365

1

Los primitivos y las referencias siempre ocupan la misma cantidad de espacio.

2

... al escribir una implementación lista de arreglo, entiendo que es importante establecer Item(x) a null cuando se elimina (en lugar de simplemente quantity -= 1) a fin de evitar pérdidas de memoria.

Esto no es cierto. Establecer variables en null no es algo que siempre es necesario y no hacerlo no significa que tenga una pérdida de memoria.

Sin embargo, si mi lista de arreglos es una lista de arreglos primitivos, ¿tiene sentido establecerla en 0?

No, para las primitivas, no importa en absoluto, 0 o \u0000 (para un char) es simplemente un valor como cualquier otro valor. No ocupa menos espacio.

+1

* * es necesario si va a implementar un tipo 'ArrayList' similar sin embargo. Si agrego un elemento y luego lo elimino de la lista, no quiero que esa referencia permanezca en la lista sin ningún motivo. –

+0

Si está administrando su propia memoria, debe gestionar los objetos anulados que no se utilizan. Si no, el GC lo recoge si no hay más referencias a ese objeto (en algún momento no especificado). – wmorrison365

+1

@JonSkeet Sí, probablemente sea una buena idea si está implementando su propia 'Lista'. Sin embargo, mucha gente piensa que establecer variables a 'null' en general es una buena idea (sin entender exactamente por qué). En mi opinión, no debes hacer las cosas solo porque tienes una vaga idea de que es "bueno", solo hazlo si entiendes por qué. – Jesper

1

No, debe anular la ranura del objeto en la matriz para evitar la fuga. Si el objeto todavía es referenciado por su matriz, entonces no puede ser GC - por lo que la fuga a la que se refiere.

Primitivos, por otro lado se asignan en la pila de todos modos, no del montón, por lo que no se GC'd de todos modos. Las primitivas que son ejemplos de vars de clases se almacenan como campos del objeto relevante y se limpian cuando el objeto es GC'd.

Además, el JLS indica que el tamaño de una primitiva es VM-específico, pero la mayoría (todos?) VM soporta actualmente 4byte enteros. Ver el JLS para más información:

Cuestiones relacionadas