2016-03-31 32 views
6

Here e Here ho trovato che le variabili nel blocco vengono creati quando l'esecuzione raggiunge quel blocco,Qual è la durata della variabile all'interno del blocco?

per dimostrare che provato questo:

int main() 
{ 

    { 
     char a; 
     printf("Address of a %d \n",&a); 
    } 

    char b; 
    printf("Address of b %d \n",&b); 

} 

Come previsto b stato creato per primo (perché blocco esterno è eseguito prima di inner) e quando l'esecuzione ha raggiunto il blocco interno è stato creato un. Output del codice precedente:

Address of a 2686766 
Address of b 2686767 

(provata su x86 (pila cresce verso il basso, in modo variabile con maggiore indirizzo è stato creato per primo)).

Ma che dire di questo ?:

int main() 
{ 

    { 
     char a; 
     printf("Address of a %d \n",&a); 
    } // I expected that variable a should be destroyed here 


    { 
     char b; 
     printf("Address of b %d \n",&b); 
    } 

} 

uscita:

Address of a 2686767 
Address of b 2686766 

mi aspettavo che un è stato distrutto a chiusura parentesi graffa del primo blocco di istruzioni, in modo da affrontare in cui un era situato ora in cima allo stack, e b dovrebbe essere creato qui, quindi nell'output sopra entrambi gli indirizzi dovrebbero essere uguali, ma non lo sono? Le variabili vengono distrutte alla fine del blocco? Se no, perché?

+5

Comportamento indefinito per passare un 'char *' a 'printf ("% d ")'. Inoltre, gli indirizzi relativi di oggetti separati con durata di archiviazione automatica non sono specificati. Questo probabilmente dipende anche dalle impostazioni di ottimizzazione del compilatore. – EOF

+1

Usa '% p' per stampare un puntatore in' printf'. – Chiel

+0

Come hai compilato il tuo codice? Hai abilitato le ottimizzazioni? –

risposta

10

Non ci sono regole su come il compilatore colloca le variabili in memoria. Potrebbe benissimo riservare spazio per entrambi allo stesso tempo, se questo è "più semplice" in qualche modo.

E è consentito riutilizzare lo spazio per le variabili in ambiti diversi, ma non richiesto. Salvare un singolo byte potrebbe non valere la pena di cercare di "ottimizzare" l'allocazione.

0

Distruggere una variabile in C++ significa "chiamarlo distruttore". Niente di più, nient'altro. Poiché i tipi predefiniti come char s non hanno distruttori, la loro distruzione non è visibile per l'osservatore.

+0

Mi piacerebbe sapere cosa c'è di sbagliato nella mia risposta. – SergeyA

+0

@NathanOliver, e dove ho detto altrimenti? – SergeyA

+0

@NathanOliver, hai qualche prova per questo? Supponendo che b non sia un char ma un oggetto con costruttori di effetti collaterali, quando pensi che il costruttore sia eseguito? – SergeyA