Jedes Objekt in C++ hat zwei verschachtelte Zeitperioden mit ihm verbunden: Lagerdauer und Lebensdauer. Speicherdauer ist der Zeitraum, für den der vom Objekt belegte Rohspeicher zugewiesen wird. Lebensdauer ist der Zeitraum zwischen Konstruktion und Zerstörung eines tatsächlichen Objekts in diesem Speicher. (Für Objekte von POD-Typen spielt die Konstruktionszerstörung entweder keine Rolle oder ist nicht anwendbar, so dass ihre Lebensdauer der Speicherdauer entspricht).
Wenn jemand "zugewiesen" sagt, beziehen sie sich normalerweise auf Speicherdauer. Die Sprache spezifiziert nicht genau, wann die Speicherdauer des Objekts beginnt. Es ist ausreichend zu fordern, dass es an einem Punkt beginnt, bevor die Lebensdauer des Objekts beginnt beginnt.
Aus diesem Grund beginnt im Allgemeinen ein statisches Objekt, das in einer Funktion definiert ist, niemals seine Lebensdauer und theoretisch muss die Speicherdauer auch nicht beginnen. Also, in der Theorie, in vielleicht nicht einmal "zugewiesen".
In der Praxis werden jedoch alle Objekte mit statischer Speicherdauer ("Globals", lokale Statik usw.) normalerweise gleich behandelt: Sie erhalten beim Start des Programms eine bestimmte Speichermenge.
Als zusätzliche Anmerkung, wenn ein lokales Objekt mit statischer Lagerdauer eine nicht-triviale Initialisierung erfordert, wird diese Initialisierung durchgeführt, wenn die Kontrolle über die Definition gelangt zum ersten Mal. So in diesem Beispiel
void foo() {
static int *p = new int[100];
}
das dynamische Array nie, wenn die Funktion aufgerufen wird nie zugewiesen werden. Und es wird nur einmal zugewiesen, wenn die Funktion aufgerufen wird. Das sieht nicht nach dem aus, was Sie fragen, aber ich erwähne das nur für den Fall.
Dies ist ein guter Grund, Funktionen in eine separate Übersetzungseinheit zu stellen; damit nie aufgerufene Funktionen zum Zeitpunkt der Erstellung entfernt werden können. :-) –
Sie müssen zwischen __allocation__ und __initialization__ unterscheiden.Wenn eine nicht aufgerufene Funktion nicht vom Linker entfernt wird, ist es wahrscheinlich, dass der Speicher für diese Variable _allocated_ ist, obwohl sie niemals initialisiert wird. – sbi
@Thomas: Es gibt einen guten Grund, einen Compiler zu wählen, der nicht so viel Handholding benötigt. Es ist kein Hexenwerk herauszufinden, ob 'void foo()' aufgerufen wird. – MSalters