Usted está haciendo preguntas acerca de los detalles de implementación , así que la respuesta dependerá de la aplicación particular. Vamos a considerar una versión de su programa que compila realidad:
class A { public int VarA; }
class X
{
static void Main(string[] args)
{
A a1 = new A();
a1.VarA = 5;
A a2 = a1;
a2.VarA = 10;
}
}
aquí es lo que ocurre en Microsoft de CLR 4.0, corriendo C# 4.0, en modo de depuración.
En este punto, el puntero del marco de pila se ha copiado en ebp registro:
Aquí asignar memoria del montón para el nuevo objeto.
A a1 = new A();
mov ecx,382518h
call FFE6FD30
Devuelve una referencia a un objeto de pila en eax. Almacenamos la referencia en la ranura de pila ebp-48, que es una ranura temporal no asociada a ningún nombre. Recuerde, a1 aún no se ha inicializado.
mov dword ptr [ebp-48h],eax
Ahora restamos que la referencia que acaba de almacenar en la pila y copiarlo en ecx, que será utilizado para el puntero "this" a la llamada a la ctor.
mov ecx,dword ptr [ebp-48h]
Ahora llamamos al ctor.
call FFE8A518
Ahora copiamos la referencia almacenada en la ranura temporal en la pila registro eax nuevo.
mov eax,dword ptr [ebp-48h]
Y ahora copiamos la referencia en eax en la ranura pila ebp-40, que es a1.
mov dword ptr [ebp-40h],eax
Ahora debe obtener a1 en eax:
a1.VarA = 5;
mov eax,dword ptr [ebp-40h]
Recuerde, eax es ahora la dirección de los datos montón asignados para lo que hace referencia a1. El campo VarA de esa cosa es de cuatro bytes en el objeto, por lo que almacenar 5 en que:
mov dword ptr [eax+4],5
Ahora hacemos una copia de la referencia en la ranura de la pila para obtener a1 en EAX, y luego copia que en el ranura de pila para a2, que es ebp-44.
A a2 = a1;
mov eax,dword ptr [ebp-40h]
mov dword ptr [ebp-44h],eax
Y ahora como era de esperar de nuevo conseguimos A2 en EAX y luego deferencia la referencia de cuatro bytes para escribir 0x0A en el VarA:
a2.VarA = 10;
mov eax,dword ptr [ebp-44h]
mov dword ptr [eax+4],0Ah
Así que la respuesta a su pregunta es que las referencias al objeto se almacenan en la pila en tres lugares: ebp-44, ebp-48 y ebp-40. Se almacenan en registros en eax y ecx. La memoria del objeto, incluido su campo, se almacena en el montón administrado. Todo esto está en x86 en la compilación de depuración, del CLR v4.0 de Microsoft. Si desea saber cómo se almacenan las cosas en la pila, el montón y los registros en alguna otra configuración, podría ser completamente diferente. Todas las referencias se pueden almacenar en el montón, o en todos los registros; puede que no haya ninguna pila en absoluto. Depende totalmente de cómo los autores del compilador jit decidieron implementar la semántica de IL.
Como este código no se compila es muy difícil describir cómo lo maneja el tiempo de ejecución. ¿Están todas esas declaraciones destinadas a estar dentro de un cuerpo de método? ¿Son esas declaraciones de campo o declaraciones de variables locales? –