Wo wird ein nicht statisches Element eines statischen Objekts zugewiesen?

8

Ich habe diesen Code und ich frage mich über Speicherzuweisung.

%Vor%

Wo wird die anotherObject zugewiesen? im static -Code-Segment oder anderswo? Besteht das Risiko, dass anotherObject überschrieben wird? ( f wird mehrmals aufgerufen).

    
Pierre 16.04.2015, 08:27
quelle

5 Antworten

5

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?

    
Erik Alapää 16.04.2015, 08:33
quelle
1

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.

%Vor%

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.

    
Johann Gerell 16.04.2015 08:58
quelle
0

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: Ссылка

    
Zelldon 16.04.2015 08:38
quelle
0
%Vor%

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.

    
Alex Medveshchek 16.04.2015 08:49
quelle
0

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.

    
jdh8 16.04.2015 08:56
quelle

Tags und Links