Ho provato questo codice su Visual C++ 2008 e mostra che A e B non hanno lo stesso indirizzo.Stack e scope C++
int main()
{
{
int A;
printf("%p\n", &A);
}
int B;
printf("%p\n", &B);
}
Ma poiché A non esiste più quando B viene definito, mi sembra che la stessa posizione dello stack potrebbe essere riutilizzato ...
Non capisco il motivo per cui il compilatore non lo fa sembra fare quello che sembra un'ottimizzazione molto semplice (che potrebbe importare nel contesto di variabili più grandi e funzioni ricorsive per esempio). E non sembra che riutilizzarlo sarebbe più pesante sulla CPU o sulla memoria. Qualcuno ha una spiegazione per questo?
Credo che la risposta sia sulla falsariga di "perché è molto più complessa di quanto sembri", ma onestamente non ne ho idea.
modifica: alcune precisioni relative alle risposte e ai commenti riportati di seguito.
Il problema con questo codice è che ogni volta che viene chiamata questa funzione, lo stack aumenta "un numero intero troppo". Ovviamente questo non è un problema nell'esempio, ma si consideri grandi variabili e chiamate ricorsive e si ha un overflow dello stack che potrebbe essere facilmente evitato.
Quello che suggerisco è un ottimizzazione della memoria, ma non vedo come danneggerebbe le prestazioni.
E a proposito, questo accade in versione, tutte le ottimizzazioni su.
Stai compilando una build di rilascio o una build di debug? – Michael
quello che stai suggerendo è un ** spazio ** di ottimizzazione, ma non necessariamente un ottimizzazione della velocità. –
Se tutti i locali sono troppo grandi per adattarsi a una linea della cache, questo diventa un ottimizzazione della velocità poiché non si dispone di una mancanza di cache. – Michael