¿Es constante el valor del puntero 'this' durante la vida útil del objeto?

19

¿Se thisgarantiza que el valor del puntero sea constante durante la vida útil de un objeto en particular? No puedo imaginar un caso en el que cambiaría, pero no sé si no me estoy perdiendo algo.

Daniel Langr
fuente
44
El valor del thispuntero siempre es el valor de la dirección del objeto sobre el que se invocó la función. Entonces, la pregunta es equivalente a '¿puede un objeto cambiar su dirección de memoria a lo largo de la vida?'
Aconcagua
2
Vale la pena señalar: si uno habla acerca de la esperanza de vida de manera informal, un objeto que se mueve std::movecambiaría los thisindicadores. Formalmente diríamos que son dos objetos diferentes, pero informalmente uno puede pensar en ellos como "lo mismo", lo que podría generar confusión si uno no está prestando atención.
Cort Ammon

Respuestas:

27

¿Se thisgarantiza que el valor del puntero sea constante durante la vida útil de un objeto en particular?

.

Como dice el usuario Aconcagua : el valor del thispuntero siempre es el valor de la dirección del objeto en el que se llamó a la función el 1 . Entonces la pregunta es equivalente a:

¿Puede un objeto cambiar su dirección de memoria a lo largo de la vida?

Esto no es posible, por definición de lifetime2 . La vida útil de un objeto comienza cuando o después de que se obtiene su almacenamiento y termina antes de cuando se libera.


1) [class.this]/1

En el cuerpo de una [class.mfct]función miembro no estática ( ), la palabra clave thises un valor prva cuyo valor es un puntero al objeto para el que se llama la función.

2) [basic.life]/1 (énfasis mío)

La vida útil de un objeto o referencia es una propiedad de tiempo de ejecución del objeto o referencia. Se dice que una variable tiene una inicialización vacía si se inicializa por defecto y, si es de tipo de clase o una matriz (posiblemente multidimensional) de la misma, ese tipo de clase tiene un constructor trivial predeterminado. La vida útil de un objeto de tipo Tcomienza cuando :

  • se obtiene almacenamiento con la alineación y el tamaño adecuados para el tipoT , y
  • su inicialización (si la hay) está completa (incluida la inicialización vacía) ( [dcl.init]), excepto que si el objeto es un miembro de la unión o subobjeto del mismo, su vida útil solo comienza si ese miembro de la unión es el miembro inicializado en la unión ( [dcl.init.aggr], [class.base.init]), o como se describe en [class.union].

La vida útil de un objeto ode tipo Tfinaliza cuando :

  • si Tes un tipo que no es de clase, el objeto se destruye o
  • si Tes un tipo de clase, comienza la llamada al destructor, o
  • el almacenamiento que ocupa el objeto se libera o lo reutiliza un objeto que no está anidado dentro de o( [intro.object]).
YSC
fuente
¿Significa esto que sería imposible (ilegal) que un tiempo de ejecución suficientemente complejo implemente la compactación de memoria automatizada para un programa C ++? ¿O simplemente significa que necesitaría comportarse "como si" para proporcionar el mismo valor thiscada vez, independientemente de los movimientos en el montón?
Alexander - Restablece a Mónica el
2
@Alex claramente prevalece la regla como si. Siempre.
YSC
1
@ Alexander-ReinstateMonica la vtable es un concepto similar que reduce el rendimiento, pero es aceptado ya que los beneficios superan las desventajas. Los procesadores modernos son realmente eficientes con indirección.
Mark Ransom
1
@MarkRansom " es un puntero garantizado para ser la dirección de un objeto, o es el compilador libre de agregar un nivel de indirección? " Por definición, ptr es la dirección de un objeto, pero "dirección" podría ser un concepto abstracto de alto nivel . Pero luego, si introduce la indirección, necesita atomicidad, necesita bloqueo, necesita un montón de trabajo adicional en todos los accesos de cualquier objeto, si hay hilos. Simplemente por su apariencia, puedo hacerlo, es inviable (y ni siquiera he considerado el hecho de que C / C ++ se duplica como un lenguaje de bajo nivel).
curioso
1
@curiousguy haces buenos puntos, y ya no estoy argumentando que la indirección sería práctica. Sin embargo, todavía hace un buen experimento mental.
Mark Ransom
8

Un objeto tiene una región de almacenamiento. thisseñala allí.

[intro.object]/1

Un objeto ocupa una región de almacenamiento en su período de construcción ( [class.cdtor]), a lo largo de su vida útil y en su período de destrucción ( [class.cdtor]).

Caleth
fuente
-1

Se thisgarantiza que el valor de será constante si el programa lo lee alguna vez, si posteriormente algunos bits del valor de lectura son imposibles de recolectar basura o si posteriormente algunos bits del valor de lectura escaparon fuera del programa. En todos los demás casos, se comporta como un gato de Schrödinger, es decir, es constante y variable al mismo tiempo.

símbolo de los átomos
fuente
Lo siento, no entiendo nada. ¿Qué es recolectar basura y escapar fuera del programa ?
Daniel Langr
@DanielLangr Los bits del valor del identificadorthis
átomos símbolo
Esto no responde mi pregunta. ¿Qué es recolectar basura algunos pedazos? ¿O para escapar de ellos fuera del programa?
Daniel Langr
@DanielLangr Es difícil de explicar en un pequeño fragmento de texto
símbolo de los átomos