Junior
Quando e per quanto tempo esistono le variabili globali e locali in C++?
sobes.tech AI
Risposta dell'AI
Variabili globali
- Tempo di esistenza: Dall'avvio del programma fino alla sua terminazione.
- Luogo di memorizzazione: Di solito nell'area di memoria statica (.data o sezione .bss del file eseguibile).
- Inizializzazione:
- Le variabili globali non statiche, definite a livello di file, con costruttori non triviali, vengono inizializzate prima della chiamata a
main(). - Le variabili globali con inizializzazione a zero (ad esempio, int i = 0;) vengono anch'esse inizializzate prima di
main(). - Le variabili definite con
consto con durata di vita statica vengono inizializzate al caricamento del programma.
- Le variabili globali non statiche, definite a livello di file, con costruttori non triviali, vengono inizializzate prima della chiamata a
- Disponibilità: Sono visibili in tutte le funzioni all'interno dell'ambito.
Variabili locali
- Tempo di esistenza: Dalla definizione della variabile all'interno di un blocco di codice (funzione, ciclo, condizione, ecc.) fino all'uscita da quel blocco.
- Luogo di memorizzazione: Di solito nello stack (per variabili automatiche). Le variabili locali statiche sono memorizzate nell'area di memoria statica.
- Inizializzazione:
- Le variabili locali automatiche non vengono inizializzate di default (contengono "dati spazzatura"). Richiedono un'inizializzazione esplicita.
- Le variabili locali statiche vengono inizializzate una volta alla prima dichiarazione.
- Disponibilità: Visibili solo all'interno del blocco di codice in cui sono definite.
Esempi
// Variabile globale
int global_variable = 10;
void some_function() {
// Variabile locale (automatica)
int local_variable_1; // Non inizializzata
// Variabile locale (automatica) con inizializzazione
int local_variable_2 = 20;
// Variabile locale statica
static int static_local_variable = 30; // Viene inizializzata una volta
// Accesso alla variabile globale
global_variable++;
// Accesso alle variabili locali
local_variable_1 = global_variable;
static_local_variable++;
// Dopo l'uscita da some_function(), local_variable_1 e local_variable_2 cessano di esistere
// static_local_variable continua ad esistere, mantenendo il suo valore
}
int main() {
some_function();
some_function(); // static_local_variable ha mantenuto il suo valore
// La variabile globale è disponibile qui
// local_variable_1 e local_variable_2 non sono accessibili
return 0;
}
Tabella di confronto
| Caratteristica | Variabili globali | Variabili locali (automatiche) | Variabili locali statiche |
|---|---|---|---|
| Tempo di esistenza | Dall'avvio del programma fino alla sua terminazione | Dalla definizione fino all'uscita dal blocco di codice | Dal primo raggiungimento della definizione fino alla fine del programma |
| Luogo di memorizzazione | Area di memoria statica (.data, .bss) | Stack | Area di memoria statica (.data, .bss) |
| Inizializzazione | Prima della chiamata a main() o al caricamento del programma |
Non inizializzate di default. Richiedono inizializzazione esplicita | Una volta alla prima dichiarazione |
| Disponibilità | Ovunque nel scope del file | Solo all'interno del blocco di codice | Solo all'interno del blocco di codice |