En IL, puede definir variables locales utilizando la directiva .locals
. ¿Dónde están almacenadas estas variables, stack o heap?¿Dónde se almacenan las variables locales de .NET?
Respuesta
Es en gran medida un detalle de implementación del compilador JIT. Intentará muy difícil almacenar variables locales en un registro de CPU, muy eficiente. La pila es la tienda de respaldo habitual, en caso de que no haya suficientes registros disponibles para almacenar todas las variables locales.
Gran diferencia entre los nervios x86 y x64 por ejemplo. x64 tiene muchos más registros disponibles. Esto también se aplica a los argumentos pasados a un método. x86 permite que 2 pasen en un registro de CPU, x64 permite 4. Además, todo lo que se puede almacenar en la pila FPU o registros XMM. Entonces, en realidad hay cuatro lugares distintos donde se puede almacenar una variable local.
Si el objeto no es un tipo de valor, se asigna en el montón y se almacena una referencia a él en la pila. De lo contrario, se asigna directamente en la pila.
En la pila con los parámetros. .. PERO .....
1) para los tipos de referencia, solo la referencia se almacena en la pila, no el objeto al que hace referencia. El objeto real se almacena en el montón.
2) para tipos de valor, el valor real se almacena en la pila.
Ahora cuando el flujo de ejecución en el método llega al cierre los datos de tipo de valor en la pila se destruyen en ese momento, mientras que los objetos de tipo de referencia en el montón (cuyas referencias estaban aquí en la pila de este método) entregado al sistema de recolección de basura para su recolección en un momento apropiado decidido por el propio recolector de basura.
Esto también es engañoso por las mismas razones que en la respuesta marcada. Además, definitivamente no hay destrucción en marcha. Ni en el IL ni en el código de la máquina. La ubicación de la pila simplemente se abandona y finalmente es sobrescrita por otro marco de pila de activación. Incluso la noción de que los tipos de referencia están en el montón no es precisa. Las cadenas internas se almacenan realmente en el montón del cargador, el mismo lugar donde se guardan las variables estáticas. Detalles, detalles. –
@Hans: gracias por los detalles ... agradeció su explicación. – explorer
- 1. ¿Dónde se almacenan las variables locales finales de Java?
- 2. Cómo | ¿Dónde se almacenan las variables cerradas?
- 3. ¿Dónde se almacenan las variables locales, globales, estáticas, automáticas, de registro, externas, const y volátiles?
- 4. Linux: ¿dónde se almacenan las variables de entorno?
- 5. ¿Dónde se almacenan las variables de entorno en el registro?
- 6. ¿Dónde se almacenan las variables constantes en C?
- 7. ¿Dónde se almacenan las macros?
- 8. ¿Dónde se almacenan las propiedades. Configuración predeterminada?
- 9. ¿Dónde se almacenan las compras de InAPP?
- 10. ¿Dónde se almacenan las preferencias compartidas?
- 11. ¿Las declaraciones de funciones locales se almacenan en caché?
- 12. ¿Cómo se almacenan las variables de bytes en la memoria?
- 13. ¿Cómo se definen las variables estáticas locales locales de subprocesos?
- 14. acceso todas las variables locales
- 15. iPhone: ¿Dónde se almacenan NSUserDefaults?
- 16. ¿Dónde se almacenan las reseñas de producto de magento 1.5?
- 17. Prevenir .NET de "lifting" variables locales
- 18. ¿En qué objeto se almacenan las variables globales de Javascript?
- 19. ¿Dónde se almacenan las imágenes dentro de los programas?
- 20. ¿Dónde se almacenan las clases de Java en Oracle?
- 21. Imprimir todas las variables globales/variables locales?
- 22. ¿Dónde y cómo se almacenan las contraseñas en Magento?
- 23. ¿Dónde se almacenan las propiedades extendidas en SQL Server?
- 24. ¿Dónde se almacenan las tablas temporales en el servidor sql?
- 25. ¿Dónde se almacenan las cookies en el sistema?
- 26. ¿Dónde se almacenan los módulos de python?
- 27. ¿Dónde se almacenan los mensajes flash?
- 28. ¿Dónde almacenan las cookies los navegadores?
- 29. ¿Cuándo se asigna espacio de pila para las variables locales?
- 30. ¿Dónde se almacenan los ivars sintetizados?
+1, hay mucha confusión sobre locals y parámetros cuando se trata de IL. IL funciona con una pila de operaciones, pero esto no corresponde directamente a una 'pila de llamadas', como la generada por un compilador de C con la convención de llamadas 'cdecl' o 'stdcall'. Tanto los argumentos como los lugareños se tratan como espacios numerados; la única área donde hay similitud con una pila de llamadas es cuando los parámetros de una llamada a un método se extraen de la pila de operaciones para cargarlos en las ranuras de argumentos para la llamada al método. –