Czy wartość wskaźnika „ten” jest stała w czasie życia obiektu?


19

Czy wartość thiswskaźnika jest gwarantowana jako stała przez cały czas życia określonego obiektu? Nie mogę sobie wyobrazić przypadku, w którym to się zmieni, ale nie wiem, czy czegoś mi nie brakuje.


4
Wartość thiswskaźnika zawsze jest wartością adresu obiektu, na który funkcja została wywołana. Pytanie jest więc równoważne z „czy obiekt może zmienić swój adres pamięci w czasie życia?”
Aconcagua,

2
Warto zauważyć: jeśli ktoś mówi nieformalnie o długości życia, obiekt, przez który się porusza std::move, zmienia thiswskaźniki. Formalnie powiedzielibyśmy, że są to dwa różne przedmioty, ale nieoficjalnie można myśleć o nich jako o „tym samym”, co może powodować zamieszanie, jeśli nie zwraca się uwagi.
Cort Ammon

Odpowiedzi:


27

Czy wartość this wskaźnika jest gwarantowana jako stała przez cały czas życia określonego obiektu?

tak .

Jak ujmuje to użytkownik Aconcagua : wartość thiswskaźnika zawsze jest wartością adresu obiektu, na którym wywołano funkcję 1 . Pytanie jest więc równoważne z:

Czy obiekt może zmienić swój adres pamięci w czasie życia?

Nie jest to możliwe z definicji lifetime2 . Żywotność obiektu zaczyna się, kiedy lub po jego zapisaniu, i kończy się przed jego zwolnieniem.


1) [class.this]/1

W treści niestatycznej ( [class.mfct]) funkcji członka słowo kluczowe thisto składowej wartością, której wartość jest wskaźnikiem do obiektu, dla którego funkcja jest wywoływana.

2) [basic.life]/1 (moje podkreślenie)

Czas życia obiektu lub odwołania jest właściwością środowiska wykonawczego obiektu lub odwołania. Mówi się, że zmienna ma pustą inicjalizację, jeśli jest inicjowana domyślnie, a jeśli jest typu klasowego lub jej (prawdopodobnie wielowymiarowej) tablicy, ten typ klasy ma trywialny domyślny konstruktor. Żywotność obiektu typu Tzaczyna się, kiedy :

  • przechowywanie z odpowiednim wyrównaniem i rozmiarem dla rodzajuTuzyskuje się , oraz
  • jego inicjalizacja (jeśli istnieje) jest zakończona (w tym nieudana inicjalizacja) ( [dcl.init]), z wyjątkiem tego, że jeśli obiekt jest członkiem związku lub jego podobiektem, jego żywotność rozpoczyna się tylko wtedy, gdy ten członek związku jest inicjowanym członkiem związku ( [dcl.init.aggr], [class.base.init]) lub jako opisane w [class.union].

Żywotność obiektu otypu Tkończy się, gdy :

  • jeśli Tjest typem innym niż klasa, obiekt jest niszczony, lub
  • jeśli Tjest typem klasy, rozpoczyna się wywołanie destruktora, lub
  • pamięć zajmowana przez obiekt jest zwalniana lub jest ponownie wykorzystywana przez obiekt, który nie jest zagnieżdżony w o( [intro.object]).

Czy to oznacza, że ​​dla wystarczająco złożonego środowiska wykonawczego wdrożenie automatycznego zagęszczania pamięci dla programu C ++ byłoby niemożliwe (nielegalne)? Czy też oznacza to po prostu, że musiałby zachowywać się „tak, jakby”, aby za thiskażdym razem zapewniać tę samą wartość , niezależnie od ruchów na stosie?
Alexander - Przywróć Monikę

2
@Alex wyraźnie obowiązuje zasada „tak, jakby”. Zawsze.
YSC

1
@ Alexander-ReinstateMonica vtable to podobna koncepcja, która zmniejsza wydajność, ale jest akceptowana, ponieważ korzyści przeważają nad wadą. Nowoczesne procesory są naprawdę wydajne z pośrednią obsługą.
Mark Ransom

1
@ MarkRansom ” jest wskaźnikiem, który gwarantuje adres obiektu, czy też kompilator może dodawać poziom pośredni?Z definicji ptr jest adresem obiektu, ale „adres” może być abstrakcyjnym pojęciem wysokiego poziomu . Ale jeśli wprowadzisz pośredniość, potrzebujesz atomowości, potrzebujesz blokady, potrzebujesz dodatkowej pracy na wszystkich dostępach dowolnego obiektu, jeśli są wątki. Po prostu wyglądem i stylem, że mogę, jest to niewykonalne (a nawet nie uważałem, że C / C ++ podwaja się jako język niskiego poziomu).
ciekawy

1
@ curiousguy robisz dobre punkty, a ja już nie twierdzę, że pośrednictwo byłoby praktyczne. Nadal jednak stanowi dobry pomysł na eksperyment.
Mark Ransom


-1

Wartość thisgwarantowana jest stała, jeśli program kiedykolwiek ją odczyta, jeśli później niektóre bity wartości odczytu nie są możliwe do wyrzucenia elementów bezużytecznych lub jeśli następnie niektóre bity wartości odczytu uciekły poza program. We wszystkich innych przypadkach zachowuje się jak kot Schrödingera, to znaczy jest stały i zmienny jednocześnie.


Przepraszam, nie rozumiem wcale. Co to jest wyrzucanie elementów bezużytecznych i ucieczka poza program ?
Daniel Langr

@DanielLangr Bity wartości identyfikatorathis
atomsymbol

To nie odpowiada na moje pytanie. Co to za śmieci, zbieraj trochę bitów? Lub uciec przed nimi poza programem?
Daniel Langr

@DanielLangr Trudno to wyjaśnić w małym fragmencie tekstu
atomsymbol
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.