Depende mucho del compilador, pero lógicamente el almacenamiento se asigna tan pronto como se declara la variable.
Considere esto simplista C++ ejemplo:
// junk.c++
int addtwo(int a)
{
int x = 2;
return a + x;
}
Cuando GCC compila esto, se genera el siguiente código (; comentarios mina):
.file "junk.c++"
.text
.globl _Z6addtwoi
.type _Z6addtwoi, @function
_Z6addtwoi:
.LFB2:
pushl %ebp ;store the old stack frame (caller's parameters and locals)
.LCFI0:
movl %esp, %ebp ;set up the base pointer for our parameters and locals
.LCFI1:
subl $16, %esp ;leave room for local variables on the stack
.LCFI2:
movl $2, -4(%ebp) ;store the 2 in "x" (-4 offset from the base pointer)
movl -4(%ebp), %edx ;put "x" into the DX register
movl 8(%ebp), %eax ;put "a" (+8 offset from base pointer) into AX register
addl %edx, %eax ;add the two together, storing the results in AX
leave ;tear down the stack frame, no more locals or parameters
ret ;exit the function, result is returned in AX by convention
.LFE2:
.size _Z6addtwoi, .-_Z6addtwoi
.ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
.section .note.GNU-stack,"",@progbits
Todo entre _Z6addtwoi y .LCFI2 es repetitivo código utilizado para configurar el marco de la pila (almacenar las variables de la función anterior, etc. de forma segura fuera del camino). El último "subl $ 16,% esp" es la asignación de la variable local x.
.LCFI2 es la primera parte del código de ejecución real que ha escrito. "movl $ 2, -4 (% ebp)" está poniendo el valor 2 en la variable. (Inicialización, en otras palabras.) Ahora su espacio se asigna Y se inicializa. Después de eso, carga el valor en el registro de EDX y lo sigue moviendo su parámetro, encontrado en "8 (% ebp)", en otro registro EAX. Luego agrega los dos juntos, dejando el resultado en EAX.Este es ahora el final de cualquier código que hayas escrito realmente. El resto nuevamente es solo repetitivo. Dado que GCC exige que los enteros se devuelvan en EAX, no es necesario realizar ningún trabajo para el valor de retorno. La instrucción "dejar" deshace el marco de la pila y la instrucción "ret" devuelve el control a la persona que llama.
TL; Resumen de DR: puede pensar que su espacio ha sido asignado con la primera línea de código ejecutable en su bloque (emparejado {}).
Pensé que limpiaría esto un poco con comentarios explicativos ya que esta es la respuesta seleccionada.
Supongo que está hablando de almacenamiento en la pila, no en un registro, ¿verdad? – Ponkadoodle
Sí en la pila. – Brandon
riiiiight ....... ahora – Russell