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?

Sì .

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.