Alle Nicht-Heap-Objekte befinden sich im statischen Segment innerhalb der statischen A-Instanz von f ().
Beim Überschreiben könnte dies in älteren C / C ++ passieren, wenn Sie verschiedene Singleton-Idiome in Multi-Thread-Code verwendet haben. Aber z.B. neuere GCC-Versionen verwenden die neuen Standardanforderungen für die automatische Thread-sichere Initialisierung von statischen Objekten. Siehe z.B. Ist die lokale statische Variableninitialisierung in C ++ 11 Thread-sicher?
Speicher ist entweder statisch oder dynamisch zugewiesen. Dynamische Zuordnung erhalten Sie, wenn Sie Speicher zur Laufzeit zuweisen, z. B. new
und malloc
. Die statische Zuordnung ist "der Rest". Der Speicher für Klassenmitgliedsvariablen wird der Klasseninstanz zugeordnet. Wenn sie also statisch zugewiesen wird, enden die Elemente im selben Teil des Speichers, und wenn sie dynamisch zugewiesen werden, enden die Elemente dort, wo sich der dynamische Speicher befindet. Dies gilt auch für Zeigerelementvariablen, aber der tatsächliche Speicher, auf den es zeigt, kann entweder dynamisch ( new
und malloc
) oder statisch zugewiesen sein.
Wenn Sie also eine statische Klasseninstanz haben, wird der Speicher für sie und ihre Member im Codebeispiel normalerweise zugewiesen, aber das ist ein Implementierungsdetail.
Wenn das Element ein Zeiger ist, der auf dynamisch zugewiesenen Speicher zeigt, ist dieser Speicher , wo der verwendete Zuordner entscheidet . Der "Heap" ist das häufigste Implementierungsdetail von dynamisch zugewiesenem Speicher, den Sie normalerweise erhalten, wenn Sie new
und malloc
verwenden, aber einen benutzerdefinierten Zuordner verwenden können das steuert den Speicher an anderer Stelle, selbst im Code-Segment.
Die Variable a
ist eine statische Variable und wird nur einmal deklariert, dh die Anweisung A a;
wird nur einmal ausgeführt. Der Gültigkeitsbereich der Variablen liegt über der Funktion f
scope. Das Feld anotherObject
liegt innerhalb der Zuweisung von
das A-Objekt.
Siehe Beispiel mit dem Zählen:
%Vor%Arbeitsbeispiel: Ссылка
Siehe auch: Ссылка
Also würde anotherObject nicht überschrieben, weil static A a
eine Instanz von A im statischen Segment erstellt und alle anderen Instanzen in anderen Segmenten, abhängig davon, in welchem Segment sie erstellt werden, erstellt werden.
Obwohl beide als statisch bezeichnet werden, unterscheidet sich ein statisches Element von einer statischen lokalen Variablen.
Ein statisches Mitglied wird in der Klasse geteilt. Jede Instanz dieser Klasse verweist auf dasselbe Element.
Eine statische lokale Variable wird einmal initialisiert und nicht zerstört, wenn die Funktion zurückkehrt.
In Ihrem Code werden nicht statische Member in der Instanz a
gespeichert, und a
bleibt über die Funktion returns hinaus erhalten.