Questo dipende molto dal compilatore sotto le copertine, ma logicamente la memoria viene assegnata non appena viene dichiarata la variabile.
Considerate questo semplicistico C++ esempio:
// junk.c++
int addtwo(int a)
{
int x = 2;
return a + x;
}
Quando GCC compila questo, il seguente codice viene generato (; commenti miniera):
.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
Tutto tra il _Z6addtwoi e .LCFI2 è boilerplate codice utilizzato per impostare il frame dello stack (memorizzare le variabili della funzione precedente, ecc. in modo sicuro fuori mano). Quest'ultimo "subl $ 16,% esp" è l'allocazione della variabile locale x.
.LCFI2 è il primo bit del codice di esecuzione effettivo che è stato digitato. "movl $ 2, -4 (% ebp)" sta mettendo il valore 2 nella variabile. (Inizializzazione, in altre parole.) Ora il tuo spazio è allocato e inizializzato. Dopo di ciò carica il valore nel registro EDX e lo segue spostando il parametro, trovato in "8 (% ebp)", in un altro registro EAX. Quindi aggiunge i due insieme, lasciando il risultato in EAX.Questa è ora la fine di qualsiasi codice che hai effettivamente digitato. Il resto è di nuovo solo la caldaia. Poiché GCC richiede che gli interi siano restituiti in EAX, non è necessario eseguire alcun lavoro per il valore restituito. L'istruzione "leave" abbassa il frame dello stack e l'istruzione "ret" restituisce il controllo al chiamante.
TL; Riepilogo DR: puoi pensare che il tuo spazio sia stato allocato con la prima riga del codice eseguibile nel tuo blocco (accoppiato {}).
Ho pensato di pulirlo un po 'con commenti esplicativi visto che questa è la risposta selezionata.
Suppongo che tu stia parlando di archiviazione in pila, non in un registro, giusto? – Ponkadoodle
Sì in pila. – Brandon
riiiiight ....... now – Russell