2010-02-26 8 views
17

Sé que el tipo de referencia será basura recolectada. Quería saber si los tipos de valores también serán basura recolectada de la pila.¿Reciben los tipos de valor la basura?

+0

¿Puede definir cuidadosamente qué "basura recogida" significa para usted? –

+0

Lo que quiero decir con "basura recolectada" es que, si la aplicación no encuentra una variable de tipo de valor, se eliminará de la pila. – csharpbaby

+0

Creo que Eric explicó esto muy claramente, pero déjame responder de manera más directa, solo para estar seguro: una variable local permanecerá asignada siempre y cuando esté dentro del alcance, independientemente de si algo más hace referencia a ella. No está sujeto a recolección, solo alcance. –

Respuesta

31

No está muy claro qué significa su pregunta. ¿Puedes definir cuidadosamente qué significa "basura recolectada"? ¿Significa que "son entradas para el algoritmo GC", o "están desasignadas al compactar el montón del GC", o qué?

Los valores almacenados en la pila, ya sean valores de tipos de valores o tipos de referencia, son las raíces del algoritmo de recopilación. Son no recogidos porque son las cosas que están vivas que mantienen vivo a casi todo lo demás.

Y, obviamente, no se desasignan compactando el montón de GC; están desasignados al abrir la pila.

¿Eso responde su pregunta?

ACTUALIZACIÓN:

Lo que quiero decir con "basura recogida" es que, si una variable de tipo de valor es se considere que no se utiliza por la aplicación entonces será eliminado de la pila

Bien, estamos cada vez más cerca de responder una pregunta, creo. Ahora tenemos que entender a qué se refiere exactamente con "eliminado de la pila".

La pila es un bloque de memoria preasignada de un millón de bytes en el tamaño. Algunas veces usamos partes de ese bloque de memoria para almacenar variables locales de tipo de valor. ¿A qué te refieres con "quitado de la pila"? La pila nunca cambia de tamaño; es un bloque de un millón de bytes de memoria preasignada.

La pila se divide en dos regiones contiguas, que llamaremos las secciones "válida" y "no válida" de la pila. En las arquitecturas x86, el registro ESP apunta al límite entre esas regiones. ¿Estás preguntando "en qué condiciones la memoria asociada con una variable local particular del tipo de valor en la pila se convierte en parte de la sección no válida en función de un cambio en el valor del registro ESP en las arquitecturas x86?"

Esto podría parecer una muy, muy "detalle de implementación" de su pregunta. La pila es un detalle de implementación de una versión específica del tiempo de ejecución, por lo que si va a hacer preguntas al respecto, tendrá que aceptar el hecho de que está preguntando acerca de un valor específico en un entorno específico registrarse en una arquitectura de chip específica.

Más información:

http://blogs.msdn.com/ericlippert/archive/2009/02/17/references-are-not-addresses.aspx

http://blogs.msdn.com/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx

http://blogs.msdn.com/ericlippert/archive/2009/05/04/the-stack-is-an-implementation-detail-part-two.aspx

http://blogs.msdn.com/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx

estoy un poco confundido ahora para leer lo que usted ha mencionado acerca de "valores" y "v tipos de alue ".Me resulta difícil entender la diferencia.

¡Es complicado! Usamos las palabras "valor" y "referencia" para significar demasiadas cosas. Déjame resumir.

Una variable es una ubicación de almacenamiento .

Cada variable tiene tipo. Un tipo puede ser un tipo de valor o un tipo de referencia .

Una ubicación de almacenamiento contiene valor.

El valor de una variable de tipo de valor es un valor del tipo de valor. Por ejemplo, int es un tipo de valor. El valor de una variable de tipo int es int, por ejemplo, 12.

El valor de una variable de tipo de referencia es una referencia a un objeto de ese tipo, o nulo. Por ejemplo, string es un tipo de referencia. El valor de una variable de tipo cadena es una referencia a una cadena, o nulo.

Es por eso que se llaman "tipos de valor" y "tipos de referencia". El valor de un tipo de valor es una instancia del tipo. El valor de un tipo de referencia es una referencia a una instancia del tipo.

¿Tiene sentido ahora?

+0

Gracias. Esto borra todas mis dudas :-). Gracias por esta excelente explicación. (PD: Soy un gran admirador suyo. ¡He impresionado a mis amigos al compartir el conocimiento de sus blogs!) – csharpbaby

+0

@csharpbaby: De nada.He puesto algunos enlaces a algunos artículos de blog que pueden resultar interesantes en el texto anterior. –

7

El tiempo de ejecución de lenguaje común (CLR) asigna memoria para objetos en dos lugares: la pila y el montón.

Los tipos de valores se almacenan en la pila junto con referencias al contenido del tipo de referencia almacenado en el montón. El objetivo del recolector de elementos no utilizados es desasignar la memoria asignada al contenido del tipo de referencia en el montón cuando se saca la referencia de la pila.

Un tipo de valor que no es el contenido de un tipo de referencia no se almacena en el montón, por lo que no lo limpia el recolector de elementos no utilizados.

See here for a slightly more in depth description of value vs reference types

See here for a lot more in depth description

+4

Los tipos de valores no se almacenan necesariamente en la pila. Una declaración correcta es "valores de tipo de valor que son almacenamientos temporales o variables locales que no son locales cerrados de un método anónimo o expresión lambda y que no se encuentran en un bloque iterador que se almacenan en la pila en la implementación de Microsoft de la CLI. " Un tipo de valor que no está en el montón de GC no lo limpia el recolector de basura. Un tipo de valor que * es * en el montón del GC * es * limpiado por el recolector de basura. –

+1

+1 De acuerdo, pero tratar de convertir eso en una respuesta clara y concisa que sea fácil de entender es un desafío ;-) –

+0

Tienes razón. Creo que ahora estoy pensando mucho después de que Eric escribió "Values ​​of value type". :) – csharpbaby

1

Suponiendo que quiere decir "recolector de basura" en el sentido del recolector de basura comprobando si están vivos y luego la recuperación de la memoria, entonces la respuesta es no, no son "basura recogidas" .

La razón es que la memoria de la pila se recupera automáticamente a medida que se eliminan los marcos de pila.

tener una lectura de este artículo: http://en.wikipedia.org/wiki/Stack_%28data_structure%29#Hardware_stacks

+0

Gracias Paolo. Leeré este artículo :) – csharpbaby

Cuestiones relacionadas