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?
Respuesta
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
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?
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
@csharpbaby: De nada.He puesto algunos enlaces a algunos artículos de blog que pueden resultar interesantes en el texto anterior. –
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
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 De acuerdo, pero tratar de convertir eso en una respuesta clara y concisa que sea fácil de entender es un desafío ;-) –
Tienes razón. Creo que ahora estoy pensando mucho después de que Eric escribió "Values of value type". :) – csharpbaby
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
Gracias Paolo. Leeré este artículo :) – csharpbaby
- 1. ¿Se recopilan los tipos de valor de la basura?
- 2. ¿Se recolectan los tipos primitivos de basura en Android?
- 3. mutabilidad de los tipos de valor
- 4. Los tipos de referencia viven en el montón, los tipos de valor viven en la pila
- 5. ¿Los datagramas siempre se reciben por completo?
- 6. valor predeterminado de "valor" en los tipos primitivos
- 7. ¿Beneficio de los tipos de valor sobre los tipos de referencia?
- 8. En C#, el uso de los tipos de valor frente a los tipos de referencia
- 9. Delegados contravariantes Tipos de valor
- 10. Valor y tipos de referencia
- 11. ios reciben la etiqueta de número de la etiqueta
- 12. Prueba de valor vacío universal para todos los tipos
- 13. ¿Los tipos de valor son inmutables por definición?
- 14. ¿Deberíamos utilizar la recolección de basura "estación de trabajo" o la recolección de basura "servidor"?
- 15. C# compare dos objetos de tipos desconocidos (incluidos los tipos de referencia y valor)
- 16. diálogo "apprequests" informa éxito, los destinatarios no reciben nada
- 17. Verificación del valor por defecto utilizando los tipos genéricos
- 18. ¿La recolección de basura alguna vez afecta la pila?
- 19. Recolección de basura de los miembros estáticos
- 20. Polimorfismo de orden superior + tipos de valor
- 21. ¿Los tipos de referencia son tipos anulables?
- 22. Pasar de los tipos Java a los tipos MATLAB
- 23. Controladores de eventos que no reciben la llamada? - wxWidgets
- 24. Inicialización de valor y tipos no POD
- 25. php reciben dos elementos de la matriz aleatoria diferentes
- 26. ¿Cuáles son las diferencias entre los tipos de valores y los tipos de referencia en C#?
- 27. ¿NewLISP usa la recolección de basura?
- 28. F #: ¿Por qué los tipos de opciones no son compatibles con los tipos que aceptan nulos?
- 29. EventArgs genéricos para los tipos incorporados
- 30. Huella de memoria de los tipos de datos Haskell
¿Puede definir cuidadosamente qué "basura recogida" significa para usted? –
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
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. –