Sind Datenelemente im selben Speicherbereich wie ihre Objekte in C ++ zugeordnet?

7

Sagen Sie, ich habe eine Klasse wie folgt:

%Vor%

Und ich instanziiere es so:

%Vor%

Ist x auf dem Stapel oder der Heap? Was ist mit s?

    
fluffels 09.10.2008, 15:25
quelle

6 Antworten

9

Jedes Mal, wenn Sie ein Objekt / Symbol mit einem neuen Objekt instanziieren (wir sprechen hier C ++), wird für dieses Objekt eine neue Speicherzone zugewiesen. Wenn nicht, wird es in die "lokale" Speicherzone gelegt.

Das Problem ist, dass ich keine Standarddefinition für "lokale" Speicherzone habe.

Ein Beispiel

Dies bedeutet zum Beispiel:

%Vor%

Das Objekt aa00 ist auf dem Stapel zugeordnet.

Da aa00 :: b in einem "lokalen" Speicher gemäß aa00 zugewiesen wird, wird aa00 :: b innerhalb des Speicherbereichs zugewiesen, der durch den neuen aa01-Befehl zugewiesen wird. Daher wird auch aa00 :: b auf Stapel zugeordnet.

Aber aa00 :: c ist ein Zeiger, der mit new belegt ist, so dass das von aa00 :: c entworfene Objekt auf dem Heap liegt.

Nun das knifflige Beispiel: aa01 wird über ein neues und damit auf dem Heap zugewiesen.

In diesem Fall wird, da aa01 :: b in einem "lokalen" Speicher gemäß aa01 zugewiesen wird, aa00 :: b innerhalb des Speicherbereichs zugewiesen, der durch den neuen aa01-Befehl zugewiesen wird. Daher befindet sich aa00 :: b auf dem Heap, "innerhalb" des Speichers, der bereits für aa01 reserviert ist.

Da aa01 :: c ein Zeiger ist, der mit new belegt ist, befindet sich das von aa01 :: c entworfene Objekt auf dem Heap in einem anderen Speicherbereich als dem, der für aa01 reserviert ist.

Fazit

Also, der Punkt des Spiels ist:
1 - Was ist die "lokale" Erinnerung an das untersuchte Objekt: Stack of Heap? 2 - Wenn das Objekt durch new zugewiesen wird, befindet es sich außerhalb dieses lokalen Speichers, d. H. Es befindet sich an einem anderen Ort auf dem Heap-Speicher 3 - Wenn das Objekt "ohne neu" zugewiesen ist, dann ist es im lokalen Speicher.
4 - Wenn der "lokale" Speicher auf dem Stapel ist, dann ist auch das Objekt, das ohne Neu zugeordnet wurde, auf dem Stapel 5 - Wenn sich der "lokale" Speicher auf dem Heap befindet, befindet sich das Objekt, das ohne new zugewiesen wurde, ebenfalls auf dem Heap, aber immer noch im lokalen Speicher.

Entschuldigung, ich habe kein besseres Vokabular, um diese Konzepte auszudrücken.

    
paercebal 09.10.2008, 16:02
quelle
18
%Vor%

a und alle seine Mitglieder sind auf dem Stapel.

Das Objekt, auf das t zeigt, und alle seine Member befinden sich auf dem Heap.

Der Zeiger t befindet sich auf dem Stapel.

    
moonshadow 09.10.2008 15:27
quelle
6

Da du new benutzt hast, ist es alles auf dem Heap, gespeichert [mehr oder weniger] zusammenhängend in t 's Speicherbereich.

    
Avdi 09.10.2008 15:27
quelle
5

t ist auf dem Stapel. Das Objekt bei * t befindet sich auf dem Heap. Es enthält ein int und ein SomeClass-Objekt nebeneinander in einer Einheit.

    
James Curran 09.10.2008 15:27
quelle
1

Da Sie new verwenden, ordnen Sie Ihr Objekt auf dem Heap zu. Folglich sind alle Mitglieder des Tests, auf die t zeigt, ebenfalls auf dem Heap.

    
Luc Touraille 09.10.2008 15:27
quelle
1
%Vor%

a ist auf dem Stapel; seine Mitglieder a.i und a.m (einschließlich aller Mitglieder von a.m) und a.p (der Zeiger, nicht das Objekt, auf das er zeigt) sind Teil davon und so auch auf dem Stapel.

Das Objekt, auf das a.p zeigt, befindet sich auf dem Heap.

Das Objekt, auf das b zeigt, befindet sich auf dem Heap einschließlich aller seiner Member. und so ist das Objekt, auf das sich b.p.

bezieht     
DJClayworth 09.10.2008 16:54
quelle

Tags und Links