在对象的生存期内,“ this”指针的值是否恒定?


19

this在特定对象的生存期内,指针的值是否保证是恒定的?我无法想象情况会发生变化,但不知道我是否不缺少任何东西。


4
的值this的指针总是是在其上调用函数的对象的地址的值。因此,问题等同于“对象
阿空加瓜

2
值得注意的是:如果人们非正式地谈论寿命,则通过移动的对象std::move将更改this指针。形式上,我们会说这是两个不同的对象,但非正式地,人们可能会认为它们是“相同的”,如果不注意的话,可能会引起混乱。
Cort Ammon

Answers:


27

this在特定对象的生存期内,指针的值是否保证是恒定的?

是的

正如用户Aconcagua所说:this指针的值始终是在1上调用了函数的对象的地址值。因此,问题等同于:

对象可以在生存期内更改其内存地址吗?

根据lifetime2的定义,这是不可能的。对象的生存期从获取对象的时间开始或之后开始,而在释放对象之前结束。


1) [class.this]/1

在非静态([class.mfct])成员函数的主体中,关键字thisprvalue,其值是指向为其调用该函数的对象的指针。

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
@Alex显然以一般规则为准。总是。
YSC

1
@ Alexander-ReinstateMonica vtable是一个类似的概念,它会降低性能,但由于其好处大于缺点,因此已被接受。现代处理器通过间接访问确实非常有效。
Mark Ransom

1
@MarkRansom“ 是一个指针,保证是对象的地址,还是编译器可以自由添加一个间接层?根据定义,ptr是对象的地址,但是“ address”可以是一个高级抽象概念。但是,如果您引入了间接寻址,则需要原子性,需要锁定,如果有线程,则需要对任何对象的所有访问进行大量额外工作。仅凭其外观和感觉,我就可以认为它是行不通的(而且我什至都没有考虑过C / C ++可以兼用作低级语言的事实)。
curiousguy

1
@curiousguy,您提出了要点,而我不再争论间接是可行的。虽然它仍然是一个很好的思想实验。
Mark Ransom


-1

this如果程序曾经读取过该值,则保证了该值是恒定的;如果随后无法对该读取值的某些位进行垃圾回收,或者随后使该读取值的某些位转义到了程序之外。在所有其他情况下,它的行为都像薛定ding的猫,也就是说,它同时是恒定的和可变的。


对不起,一点都不明白。什么是垃圾回收逃脱程序外部
Daniel Langr

@DanielLangr标识符值的位this
atomsymbol

这不能回答我的问题。什么是垃圾收集一些位?还是要使它们脱离程序之外?
Daniel Langr

@DanielLangr很难用一小段文字来解释
atomicymbol
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.