2014-01-12 4 views
5

In C++, dieser Zeiger an die Methode als ein verstecktes Argument übergeben, die tatsächlich auf das aktuelle Objekt zeigt, aber wo dieser Zeiger im Speicher gespeichert ... im Stapel, Heap, Daten wo ?Wo Speicher für 'dieser' Zeiger zugeordnet

+0

Angenommen, Sie meinen, wie Ihr Code weiß, wo 'dies' ist, wenn eine Methode aufgerufen wird ... Es wird abhängig von einer Reihe von Faktoren unterschiedlich sein, aber sicherlich können Sie die Assembly Ihres Compilers erraten oder ansehen erzeugt, um eine Idee zu bekommen. – asveikau

+0

Ich lese, dass "dies" kein Zeiger ist, es ist ein Ausdruck, ist es wahr? – nilesh

+0

genaues Duplikat von [Wo ist der 'dieser' Zeiger im Computer gespeichert?] (Http://stackoverflow.com/questions/16585562/where-is-the-this-pointer-stored-in-computer-memory) –

Antwort

6

Der Standard spezifiziert nicht, wo der this Zeiger gespeichert ist.

Wenn es bei einem Aufruf dieser Funktion an eine Elementfunktion übergeben wird, übergeben einige Compiler es in einem Register und andere übergeben es auf dem Stapel. Es kann auch von den Compileroptionen abhängen.

Über das einzige, was Sie sicher sein können ist, dass this ist ein rvalue des grundlegenden Typs, so dass Sie nicht seine Adresse nehmen können.

Es war nicht immer so.

In vor-Standard-C++ können Sie zuweisen this, z. um Konstruktorfehler anzuzeigen. Dies war bevor Ausnahmen eingeführt wurden. Die moderne Standardmethode zur Anzeige von Konstruktionsfehlern ist das Auslösen einer Ausnahme, die eine geordnete Bereinigung garantiert (wenn nicht durch den Benutzercode vereitelt, wie der berüchtigte MFC-Platzierungsfehler new).

1

In C++ ist this "einfach" ein Zeiger auf das aktuelle Objekt. Sie können auf objektspezifische Daten zugreifen.

Zum Beispiel, wenn der Code in einer Klasse die folgenden Schnipsel hat:

this->temperature = 40.0f; 

setzt sich die Temperatur für jedes Objekt, beaufschlagt wird (temperature Annahme, daß keine Klasse-Ebene statisch, unter allen Objekten gemeinsam der Klasse).

Der Zeiger this muss nicht zugewiesen werden (in Bezug auf dynamisches Gedächtnis), es hängt vollständig davon ab, wie alles unter den Abdeckungen gehandhabt wird, etwas, das der Standard eigentlich nicht vorschreibt (der Standard neigt dazu, mehr zu fokussieren) auf Verhalten als Interna).

Es gibt eine beliebige Anzahl von Stellen könnte sein: auf dem Stapel, an einem bestimmten Speicherort, in einem Register, und so weiter. Alles, worum du dich kümmern musst, ist sein Verhalten, das ist im Grunde, wie du es benutzt, um Zugang zum Objekt zu bekommen.

Was thisPunkte ist das Objekt selbst und es ist in der Regel mit new für die dynamische Zuordnung oder auf dem Stack zugeordnet.

1

Der This-Zeiger ist auf dem Stapel Ihrer Klassenfunktionen (oder manchmal ein Register) zugeordnet.

Dies ist jedoch nicht die Frage, die Sie tatsächlich stellen.

+1

Tatsächlich scheint es genau die Frage zu sein, die gestellt wird. Ich fürchte, die Antwort ist zu vage für eine Stellungnahme. –

0

Der This-Zeiger befindet sich im Objekt selbst *. Sortieren. Es ist der Speicherort des Objekts.

Wenn sich das Objekt auf dem Stapel befindet, befindet sich dieser Zeiger auf dem Stapel.

Wenn sich das Objekt auf dem Heap befindet, befindet sich der this-Zeiger auf dem Heap.

Fazit, es ist nichts, worüber man sich Sorgen machen muss.

* [UPDATE] Lassen Sie mich meine Antwort rückgängig machen/klären/korrigieren. Der physische Zeiger befindet sich nicht im Objekt.

Ich würde schließen, dass dieser This-Zeiger vom Compiler abgeleitet wird und einfach die Adresse des Objekts ist, die in der Symboltabelle gespeichert ist. Semantisch ist es innerhalb des Objekts, aber das war nicht das, was das OP gefragt hat.

Hier ist das Speicherlayout von 3 Variablen auf dem Stapel. Der mittlere ist ein Objekt. Sie können sehen, es hält es ist eine Variable und nichts anderes:

enter image description here

+0

dann, wenn wir Größe des Objekts berechnen, dann sollten wir die tatsächliche Größe + Größe dieses Zeigers erhalten, d. H. 4 Bytes extra. Aber das ist nicht der Fall – nilesh

+0

Ich glaube nicht, dass es in der Größe von Operator angezeigt wird. Der Zeiger kann abhängig vom Compiler unterschiedlich groß sein. Wenn Sie virtuelle Funktionen haben, gibt es auch eine versteckte Tabelle von Funktionszeigern, die nicht im Operator sizeof angezeigt werden. –

+0

, aber wir können zusätzliche 4 Byte für virtuelle Zeiger zugewiesen sehen, die auf vtable – nilesh