Il valore del puntatore `this` è costante durante la vita dell'oggetto?


19

Il valore del thispuntatore è garantito come costante durante la vita di un particolare oggetto? Non riesco a immaginare un caso in cui cambierebbe, ma non so se non mi sto perdendo qualcosa.


4
Il valore del thispuntatore è sempre il valore dell'indirizzo dell'oggetto su cui è stata chiamata la funzione. Quindi la domanda è equivalente a "un oggetto può cambiare il suo indirizzo di memoria nel corso della vita?"
Aconcagua,

2
Vale la pena notare: se si parla di durata della vita in modo informale, un oggetto che viene spostato std::movecambierebbe i thispuntatori. Formalmente diremmo che si tratta di due oggetti diversi, ma informalmente si potrebbe pensare che siano "gli stessi", il che potrebbe generare confusione se non si presta attenzione.
Cort Ammon,

Risposte:


27

Il valore del thispuntatore è garantito come costante durante la vita di un particolare oggetto?

.

Come dice l' utente Aconcagua : il valore del thispuntatore è sempre il valore dell'indirizzo dell'oggetto su cui è stata chiamata la funzione su 1 . Quindi la domanda è equivalente a:

Un oggetto può cambiare il suo indirizzo di memoria nel tempo?

Questo non è possibile, per definizione di lifetime2 . La durata di un oggetto inizia quando o dopo l'ottenimento della sua memorizzazione e termina prima di quando viene rilasciato.


1) [class.this]/1

Nel corpo di un non-statico ( [class.mfct]funzione membro), la parola chiave thisè un prvalue cui valore è un puntatore all'oggetto che viene chiamata la funzione.

2) [basic.life]/1 (enfasi sulla mia)

La durata di un oggetto o riferimento è una proprietà di runtime dell'oggetto o riferimento. Si dice che una variabile abbia un'inizializzazione vuota se è inizializzata in modo predefinito e, se è di tipo classe o una sua matrice (possibilmente multidimensionale), quel tipo di classe ha un banale costruttore predefinito. La durata di un oggetto di tipo Tinizia quando :

  • si ottiene una memoria con il corretto allineamento e dimensione per tipoT , e
  • la sua inizializzazione (se presente) è completa (inclusa l'inizializzazione vacua) ( [dcl.init]), tranne per il fatto che se l'oggetto è un membro del sindacato o un suo oggetto secondario, la sua durata inizia solo se quel membro del sindacato è il membro inizializzato nel sindacato ( [dcl.init.aggr], [class.base.init]) o come descritto in [class.union].

La durata di un oggetto odi tipo Ttermina quando :

  • se Tè un tipo non di classe, l'oggetto viene distrutto o
  • se Tè un tipo di classe, inizia la chiamata del distruttore o
  • la memoria occupata dall'oggetto viene rilasciata o riutilizzata da un oggetto che non è nidificato in o( [intro.object]).

Ciò significa che sarebbe impossibile (illegale) per un runtime sufficientemente complesso implementare la compattazione automatica della memoria per un programma C ++? O significa semplicemente che dovrebbe comportarsi "come se", in modo da fornire lo stesso valore di thisogni volta, indipendentemente dai movimenti nell'heap?
Alexander - Ripristina Monica il

2
@Alex prevale chiaramente la regola as-if. Sempre.
YSC,

1
@ Alexander-ReinstateMonica la vtable è un concetto simile che riduce le prestazioni, ma è accettata poiché i vantaggi superano il rovescio della medaglia. I processori moderni sono davvero efficienti con il riferimento indiretto.
Mark Ransom,

1
@MarkRansom " è un puntatore garantito per essere l'indirizzo di un oggetto, oppure il compilatore è libero di aggiungere un livello di riferimento indiretto? " Per definizione che ptr è l'indirizzo di un oggetto, ma "indirizzo" potrebbe essere un concetto astratto di alto livello . Ma poi se si introduce il riferimento indiretto, è necessaria l'atomicità, è necessario il blocco, è necessario un sacco di lavoro aggiuntivo su tutti gli accessi di qualsiasi oggetto, se sono presenti thread. Semplicemente per l'aspetto che posso non è fattibile (e non ho nemmeno considerato il fatto che C / C ++ raddoppi come un linguaggio di basso livello).
curioso

1
@curiousguy fai buoni punti, e non sto più sostenendo che l'indirizzamento sarebbe pratico. È comunque un buon esperimento mentale.
Mark Ransom il


-1

Il valore di thisè garantito essere costante se il programma lo legge mai, se successivamente alcuni bit del valore letto sono impossibili da raccogliere in modo errato o se successivamente alcuni bit del valore letto sono sfuggiti al di fuori del programma. In tutti gli altri casi, si comporta come un gatto di Schrödinger, ovvero è costante e variabile allo stesso tempo.


Scusa, non capisco affatto. Cosa deve raccogliere la spazzatura e scappare al di fuori del programma ?
Daniel Langr,

@DanielLangr I bit del valore dell'identificatorethis
atomsymbol

Questo non risponde alla mia domanda. Cosa significa immondizia raccogliere alcuni frammenti? O per sfuggirli al di fuori del programma?
Daniel Langr,

@DanielLangr È difficile da spiegare in un piccolo pezzo di testo
atomsymbol
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.