Чи є значення вказівника `цей` постійним протягом життя об'єкта?


19

Чи thisгарантовано, що значення покажчика є постійним протягом життя певного об'єкта? Я не можу уявити собі випадок, коли це зміниться, але не знаю, чи я щось не пропускаю.


4
Значення thisвказівника завжди - це значення адреси об’єкта, на який була викликана функція. Отже, питання еквівалентно "чи може об'єкт змінити свою пам'ять протягом життя?"
Аконкагуа

2
Варто зауважити: якщо говорити про тривалість життя неофіційно, об’єкт, який переміщується через std::move, змінить thisпокажчики. Формально ми б сказали, що це два різних об'єкти, але неофіційно можна вважати їх "однаковими", що може спричинити плутанину, якщо не звертати уваги.
Корт Аммон

Відповіді:


27

Чи thisгарантовано, що значення покажчика є постійним протягом життя певного об'єкта?

Так .

Як зазначає користувач Aconcagua : значення thisвказівника завжди є значенням адреси об'єкта, на якому функція викликалася 1 . Тож питання еквівалентно:

Чи може об’єкт змінити свою адресу пам'яті протягом життя?

Це неможливо, за визначенням lifetime2 . Термін експлуатації предмета починається, коли або після його зберігання, і закінчується до моменту його звільнення.


1) [class.this]/1

У тілі нестатичної функції ( [class.mfct]) члена ключове слово this- це перше значення, значення якого є вказівником на об'єкт, для якого викликається функція.

2) [basic.life]/1 (наголос мій)

Термін експлуатації об'єкта чи посилання - це властивість виконання об'єкта чи посилання. Кажуть, що змінна має вакуумну ініціалізацію, якщо вона є ініціалізованою за замовчуванням, і якщо вона класу типу або (можливо, багатовимірний) масив, цей тип класу має тривіальний конструктор за замовчуванням. Термін експлуатації об'єкта типу Tпочинається, коли :

  • зберігання з правильним вирівнюванням і розміром для типу Tвиходять , і
  • його ініціалізація (якщо така є) завершена (включаючи вакуумну ініціалізацію) ( [dcl.init]), за винятком випадків, якщо об'єкт є членом об'єднання або його суб'єктом, його тривалість життя починається лише в тому випадку, якщо цей член об'єднання є ініціалізованим членом об'єднання ( [dcl.init.aggr], [class.base.init]) або як описано в [class.union].

Термін експлуатації об'єкта oтипу Tзакінчується, коли :

  • якщо Tце некласовий тип, об'єкт знищується, або
  • якщо Tце тип класу, починається виклик деструктора або
  • сховище, яке займає об'єкт, вивільняється або повторно використовується об'єктом, який не вкладений у межах o( [intro.object]).

Чи означає це, що неможливо (незаконно) досить складний час виконання впроваджувати автоматизоване ущільнення пам'яті для програми C ++? Або це просто означає, що потрібно було б поводитись «як ніби», щоб забезпечувати однакове значення thisкожного разу, незалежно від рухів у купу?
Олександр - Відновіть Моніку

2
@ Алекс чітко переважає правило нібито. Завжди.
YSC

1
@ Alexander-ReinstateMonica vtable - це аналогічна концепція, яка знижує продуктивність, але вона прийнята, оскільки переваги переважають вниз. Сучасні процесори дійсно ефективні з непрямим впливом.
Марк Викуп

1
@MarkRansom " - це покажчик, на який гарантується адреса об'єкта, чи компілятор вільний додати рівень непрямості? " За визначенням, що ptr - адреса об'єкта, але "адреса" може бути абстрактним поняттям високого рівня. . Але тоді, якщо ви вводите опосередкованість, вам потрібна атомність, вам потрібно блокування, вам потрібна купа додаткової роботи над усіма доступами будь-якого об’єкта, якщо є нитки. Просто за зовнішнім виглядом я можу це зробити нездійсненно (і я навіть не вважав, що C / C ++ подвоюється як мова низького рівня).
curiousguy

1
@curiousguy ви заробляєте хороші моменти, і я більше не стверджую, що опосередкованість буде практичною. Він все ще робить хороший продуманий експеримент.
Марк Викуп

8

Об'єкт має область зберігання. thisбали там.

[intro.object]/1

Об'єкт займає область зберігання в період його будівництва ( [class.cdtor]) протягом усього терміну його експлуатації та в період його знищення ( [class.cdtor]).


-1

Значення thisгарантовано буде постійна , якщо програма коли - або читає, якщо згодом деякі біти значення для читання неможливо збирати сміття або якщо згодом деякі біти зчитаного значення врятувалися поза програмою. У всіх інших випадках він поводиться як кішка Шредінгера, тобто є одночасно постійним і змінним.


Вибачте, зовсім не розумію. Що таке збирання сміття та втеча за межі програми ?
Даніель Лангр

@DanielLangr Біти значення ідентифікатораthis
atomomsbol

Це не відповідає на моє запитання. Що для сміття збирають кілька шматочків? Або уникати їх поза програмою?
Даніель Лангр

@DanielLangr Важко пояснити невеликий фрагмент тексту
atomomsbol
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.