2010-09-29 23 views

Respuesta

9

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.

+0

+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. –

4

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.

9

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.

+2

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. –

+0

@Hans: gracias por los detalles ... agradeció su explicación. – explorer

Cuestiones relacionadas