Ist der Wert dieses Zeigers während der Lebensdauer des Objekts konstant?

19

Ist der Wert des thisZeigers während der Lebensdauer eines bestimmten Objekts garantiert konstant? Ich kann mir keinen Fall vorstellen, in dem sich das ändern würde, aber ich weiß nicht, ob mir etwas fehlt.

Daniel Langr
quelle
4
Der Wert des thisZeigers ist immer der Wert der Adresse des Objekts, für das die Funktion aufgerufen wurde. Die Frage ist also gleichbedeutend mit "Kann ein Objekt seine Speicheradresse im Laufe der Lebensdauer ändern?"
Aconcagua
2
Bemerkenswert: Wenn man informell über die Lebensdauer spricht, würde ein Objekt, über das bewegt wird, std::movedie thisZeiger ändern . Formal würden wir sagen, dass dies zwei verschiedene Objekte sind, aber informell kann man sie als "dasselbe" betrachten, was Verwirrung stiften könnte, wenn man nicht aufpasst.
Cort Ammon

Antworten:

27

Ist der Wert des thisZeigers während der Lebensdauer eines bestimmten Objekts garantiert konstant?

Ja .

Wie Benutzer Aconcagua es ausdrückt: Der Wert des thisZeigers ist immer der Wert der Adresse des Objekts, für das die Funktion auf 1 aufgerufen wurde . Die Frage ist also gleichbedeutend mit:

Kann ein Objekt seine Speicheradresse im Laufe der Lebensdauer ändern?

Dies ist per Definition von lifetime2 nicht möglich . Die Lebensdauer eines Objekts beginnt, wenn oder nachdem es gelagert wurde, und endet, bevor es freigegeben wird.


1) [class.this]/1

Im Hauptteil einer nicht statischen ( [class.mfct]) Elementfunktion ist das Schlüsselwort thisein Wert, dessen Wert ein Zeiger auf das Objekt ist, für das die Funktion aufgerufen wird.

2) [basic.life]/1 (Schwerpunkt Mine)

Die Lebensdauer eines Objekts oder einer Referenz ist eine Laufzeit-Eigenschaft des Objekts oder der Referenz. Eine Variable hat eine leere Initialisierung, wenn sie standardmäßig initialisiert ist, und wenn sie vom Klassentyp oder einem (möglicherweise mehrdimensionalen) Array davon ist, hat dieser Klassentyp einen trivialen Standardkonstruktor. Die Lebensdauer eines Objekts vom Typ Tbeginnt, wenn :

  • Lagerung mit der richtigen Ausrichtung und Größe für den Typ Twird erhalten , und
  • Die Initialisierung (falls vorhanden) ist abgeschlossen (einschließlich der leeren Initialisierung) ( [dcl.init]), außer dass, wenn das Objekt ein Gewerkschaftsmitglied oder ein Unterobjekt davon ist, seine Lebensdauer nur beginnt, wenn dieses Gewerkschaftsmitglied das initialisierte Mitglied in der Gewerkschaft ist ( [dcl.init.aggr], [class.base.init]) oder als beschrieben in [class.union].

Die Lebensdauer eines Objekts ovom Typ Tendet, wenn :

  • Wenn Tes sich um einen Nichtklassentyp handelt, wird das Objekt zerstört, oder
  • Wenn Tes sich um einen Klassentyp handelt, wird der Destruktoraufruf gestartet, oder
  • Der Speicher, den das Objekt belegt, wird freigegeben oder von einem Objekt wiederverwendet, das nicht in o( [intro.object]) verschachtelt ist .
YSC
quelle
Bedeutet dies, dass es für eine ausreichend komplexe Laufzeit unmöglich (illegal) wäre, eine automatisierte Speicherkomprimierung für ein C ++ - Programm zu implementieren? Oder bedeutet es nur, dass es sich "als ob" verhalten müsste this, um unabhängig von den Bewegungen auf dem Haufen jedes Mal den gleichen Wert zu liefern ?
Alexander - Monica
2
@Alex eindeutig die Als-ob-Regel herrscht. Immer.
YSC
1
@ Alexander-ReinstateMonica die vtable ist ein ähnliches Konzept, das die Leistung reduziert, aber es wird akzeptiert, da die Vorteile die Nachteile überwiegen. Moderne Prozessoren sind mit Indirektion sehr effizient.
Mark Ransom
1
@MarkRansom "Ist ein Zeiger garantiert die Adresse eines Objekts, oder kann der Compiler eine Indirektionsebene hinzufügen? " Per Definition ist ptr die Adresse eines Objekts, aber "Adresse" könnte ein abstraktes Konzept auf hoher Ebene sein . Aber wenn Sie dann die Indirektion einführen, brauchen Sie Atomizität, Sie brauchen Sperren, Sie brauchen eine Menge zusätzlicher Arbeit an allen Zugriffen eines Objekts, wenn es Threads gibt. Einfach durch das Aussehen und die Haptik kann ich, dass es nicht funktioniert (und ich habe nicht einmal die Tatsache berücksichtigt, dass C / C ++ auch eine einfache Sprache ist).
Neugieriger
1
@curiousguy Sie machen gute Punkte, und ich argumentiere nicht mehr, dass Indirektion praktisch wäre. Es ist trotzdem ein gutes Gedankenexperiment.
Mark Ransom
8

Ein Objekt hat einen Speicherbereich. thisPunkte dort.

[intro.object]/1

Ein Objekt befindet sich in seiner Bauzeit ( [class.cdtor]), während seiner gesamten Lebensdauer und in seiner Zerstörungszeit ( [class.cdtor]) in einem Speicherbereich .

Caleth
quelle
-1

Der Wert von thisist garantiert konstant, wenn das Programm ihn jemals liest, wenn anschließend einige Bits des gelesenen Werts nicht mehr müllsammeln können oder wenn anschließend einige Bits des gelesenen Werts außerhalb des Programms entkommen. In allen anderen Fällen verhält es sich wie eine Schrödingerkatze, dh es ist gleichzeitig konstant und variabel.

Atomsymbol
quelle
Entschuldigung, verstehe überhaupt nicht. Was ist Müll zu sammeln und außerhalb des Programms zu entkommen ?
Daniel Langr
@DanielLangr Die Bits des Wertes des Bezeichnersthis
Atomsymbol
Dies beantwortet meine Frage nicht. Was ist Müll, um ein paar Teile zu sammeln? Oder um ihnen außerhalb des Programms zu entkommen?
Daniel Langr
@ DanielLangr Es ist schwer in einem kleinen Textstück zu erklären
Atomsymbol