Per oggetti statici e globali, presumo che intendiate oggetti con durata di vita statica definita nello spazio dei nomi. Quando tali oggetti sono definiti con ambito locale, le regole sono leggermente diverse.
Formalmente, C++ inizializza tali variabili in tre fasi: 1. Zero inizializzazione 2. inizializzazione statico 3. dinamico inizializzazione Il linguaggio distingue anche tra variabili che richiedono inizializzazione dinamica, e quelle che richiedono statica inizializzazione: tutti gli oggetti statici (oggetti con statico durata) sono primo zero inizializzato, quindi oggetti con statico inizializzazione vengono inizializzati, quindi inizializzazione dinamica verifica.
Come semplice prima approssimazione, inizializzazione dinamica significa che qualche codice deve essere eseguito; in genere, l'inizializzazione statica non lo fa. Così:
extern int f();
int g1 = 42; // static initialization
int g2 = f(); // dynamic initialization
Un'altra approximization sarebbe che l'inizializzazione statica è supporti quello C (per le variabili con durata statica), dinamica tutto il resto.
Come il compilatore fa questo dipende, ovviamente, l'inizializzazione , ma su sistemi basati disco, dove l'eseguibile viene caricato nella memoria dal disco, i valori per statica inizializzazione sono parte dell'immagine su disco, e caricato direttamente dal sistema dal disco. Su un sistema classico Unix , variabili globali sarebbero divisi in tre "segmenti":
-
testo:
-
Il codice, caricato in una zona protetta da scrittura. Anche le variabili statiche con i tipi `const` verranno inserite qui.
-
dati:
-
Variabili statiche con inizializzatori statici.
-
BSS:
-
variabili statiche senza-inizializzatore (C e C++) o con dinamica inizializzazione (C++). L'eseguibile contiene alcuna immagine per questo segmento, e il sistema semplicemente imposta tutto a `0` prima di iniziare la vostra codice.
ho il sospetto che un sacco di sistemi moderni usano ancora qualcosa simile.
EDIT:
Un ulteriore osservazione: quanto sopra si riferisce a C++ 03. Per i programmi esistenti , C++ 11 probabilmente non cambia nulla, ma lo fa aggiungi constexpr
(il che significa che alcune funzioni definite dall'utente possono ancora essere inizializzate statiche) e thread variabili locali, che apre una lattina completamente nuova di vermi.
Tutte e quattro le variabili hanno classe di memorizzazione statica. –
@KerrekSB In che modo 'la classe di memoria statica' si riferisce alla mia domanda? – Zachary
La classe di archiviazione determina il comportamento di inizializzazione. –