La valeur du pointeur «this» est-elle constante pendant la durée de vie de l'objet?


19

La valeur du thispointeur est-elle garantie constante pendant la durée de vie d'un objet particulier? Je ne peux pas imaginer un cas où cela changerait, mais je ne sais pas si je ne manque pas quelque chose.


4
La valeur du thispointeur est toujours la valeur de l'adresse de l'objet sur lequel la fonction a été appelée. La question est donc équivalente à «un objet peut-il changer son adresse mémoire au cours de sa durée de vie?
Aconcagua

2
À noter: si l'on parle de durée de vie de manière informelle, un objet qui est déplacé via std::movechangerait de thispointeur. Formellement, nous dirions que ce sont deux objets différents, mais de manière informelle, on peut les considérer comme «les mêmes», ce qui pourrait engendrer la confusion si l'on n'y prête pas attention.
Cort Ammon

Réponses:


27

La valeur du thispointeur est-elle garantie constante pendant toute la durée de vie d'un objet particulier?

Oui .

Comme le dit l'utilisateur Aconcagua : la valeur du thispointeur est toujours la valeur de l'adresse de l'objet sur lequel la fonction a été appelée 1 . La question est donc équivalente à:

Un objet peut-il changer son adresse mémoire au cours de sa durée de vie?

Ce n'est pas possible, par définition de lifetime2 . La durée de vie d'un objet commence lorsque ou après son stockage est obtenu et se termine avant le moment où il est libéré.


1) [class.this]/1

Dans le corps d'une [class.mfct]fonction membre non statique ( ), le mot clé thisest une valeur dont la valeur est un pointeur vers l'objet pour lequel la fonction est appelée.

2) [basic.life]/1 (c'est moi qui souligne)

La durée de vie d'un objet ou d'une référence est une propriété d'exécution de l'objet ou de la référence. Une variable est dite avoir une initialisation vide si elle est initialisée par défaut et, si elle est de type classe ou un tableau (éventuellement multidimensionnel) de celle-ci, ce type de classe a un constructeur par défaut trivial. La durée de vie d'un objet de type Tcommence lorsque :

  • stockage avec l'alignement et la taille appropriés pour le typeT est obtenu , et
  • son initialisation (le cas échéant) est terminée (y compris l'initialisation vide) ( [dcl.init]), sauf que si l'objet est un membre d'union ou un sous-objet de celui-ci, sa durée de vie ne commence que si ce membre est le membre initialisé dans l'union ( [dcl.init.aggr], [class.base.init]), ou en tant que décrit dans[class.union] .

La durée de vie d'un objet ode type Tse termine lorsque :

  • si T s'agit d'un type non-classe, l'objet est détruit, ou
  • si T est un type de classe, l'appel du destructeur démarre, ou
  • l'espace de stockage occupé par l'objet est libéré ou est réutilisé par un objet qui n'est pas imbriqué dans o( [intro.object]).

Est-ce à dire qu'il serait impossible (illégal) pour un runtime suffisamment complexe d'implémenter un compactage mémoire automatisé pour un programme C ++? Ou cela signifie-t-il simplement qu'il devrait se comporter "comme si", de manière à fournir la même valeur à thischaque fois, quels que soient les mouvements du tas?
Alexander - Rétablir Monica le

2
@Alex a clairement la règle du «comme si». Toujours.
YSC

1
@ Alexander-ReinstateMonica la vtable est un concept similaire qui réduit les performances, mais il est accepté car les avantages l'emportent sur les inconvénients. Les processeurs modernes sont vraiment efficaces avec l'indirection.
Mark Ransom

1
@MarkRansom " est un pointeur garanti pour être l'adresse d'un objet, ou le compilateur est-il libre d'ajouter un niveau d'indirection? " Par définition , ptr est l'adresse d'un objet, mais "adresse" pourrait être un concept abstrait de haut niveau . Mais alors si vous introduisez l'indirection, vous avez besoin d'atomicité, vous avez besoin de verrouillage, vous avez besoin d'un tas de travail supplémentaire sur tous les accès de n'importe quel objet, s'il y a des threads. Simplement par son apparence, je peux dire que c'est irréalisable (et je n'ai même pas considéré le fait que le C / C ++ se double d'un langage de bas niveau).
curiousguy

1
@curiousguy vous faites de bons arguments, et je ne dis plus que l'indirection serait pratique. Cela fait quand même une bonne expérience de pensée.
Mark Ransom


-1

La valeur de thisest garantie constante si le programme la lit jamais, si par la suite certains bits de la valeur lue sont impossibles à récupérer ou si par la suite certains bits de la valeur lue se sont échappés en dehors du programme. Dans tous les autres cas, il se comporte comme un chat de Schrödinger, c'est-à-dire qu'il est constant et variable à la fois.


Désolé, je ne comprends pas du tout. Qu'est-ce que la poubelle et s'échapper en dehors du programme ?
Daniel Langr

@DanielLangr Les bits de la valeur de l'identifiantthis
atomesymbol

Cela ne répond pas à ma question. Qu'est-ce que pour récupérer des morceaux? Ou pour leur échapper en dehors du programme?
Daniel Langr

@DanielLangr C'est difficile à expliquer dans un petit morceau de texte
atomesymbol
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.