是否可以获取“ this”指针的地址?

Ran*_*Hao 16 c++ reference this rvalue rvalue-reference

我读到这this是一个右值,我们无法通过应用来获取其地址&this

在我的代码中,我尝试使用的引用绑定this。我想知道哪种地址可以给this?还是都错了?

到底是this什么?左值,右值,关键字还是其他?

void MyString::test_this() const{
    std::cout << "this: " << this << std::endl;
    const MyString * const& this_ref = this;
    std::cout << "thie_ref: " << &this_ref << std::endl;
    const MyString * const&& this_right = this;
    std::cout << "thie_right: " << &this_right << std::endl;
}

//this: 00CFFC14
//thie_ref: 00CFFB14
//thie_right: 00CFFAFC
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 21

我想知道哪个地址可以给this?还是两者都不对?

的地址也不是this,因为C ++抽象机未为其定义地址。this就像0。您无法获得地址0,它不是具有存储的实体,只是一些值。那么,这是做什么的呢?

int const& i = 0;
Run Code Online (Sandbox Code Playgroud)

它创建一个临时对象,将其初始化为0,然后将引用绑定到该对象。您的代码中发生了同样的事情。您创建了对包含的的不同临时对象的引用this

this是一个关键字,代表要为其执行成员函数的对象的地址。C ++抽象机不需要它占用存储空间,因此它(在逻辑上)始终只是一个简单的值,例如0。

不需要this占用存储空间是有好处的。它允许C ++在ABI上实现,在ABI this中将其传递到寄存器中(通常无法寻址)。如果&this必须定义明确,即this必须可寻址,则它将阻止实现使用寄存器来传递地址。C ++标准通常旨在不将实现捆绑在一起。

  • _“如果`this`必须是可寻址的,它将阻止实现使用寄存器来传递地址。” _仅当它被滥用时,对吗?通过假设,编译器已经在“优化”期间跳过了存储负载 (4认同)
  • @LightnessRacesinOrbit-是的。但是我所看到的问题是,ABI必须由成员函数的主体来确定(因为这可能会或可能不会使用this)。另一方面,调用代码(此外,标头)通常不了解函数体。在这种情况下,我希望下注的实现会选择悲观的ABI。不过,我可能会过于简化,以至于超出预期。 (2认同)

Uni*_*rsE 8

“您不能使用地址this”的意思是,您不能写&this

您要的是指针所代表的地址this,对吗?这就是您的第一个输出所做的。

this本身并不像指针那样实现为指针MyString* x。在这里,x它本身在内存中有一个位置,您可以做某事。喜欢&x。这是不可能的this

您最后一个问题的答案是:是的,this是一个关键字。该表达式this是主要表达式。您可以[expr.prim.this]在C ++标准的部分中阅读有关它的信息。


小智 5

this是一个包含指向 的地址的指针current object。它不是存储在某处(甚至可以更改)的变量,它是具有特殊属性的特殊关键字。

如果你想知道“当前对象”的地址,你可以在程序中简单地输出如下所示:

#include<iostream>

using namespace std;

class Test
{
    public:
            void fun()
            {
                    cout << "Address of this :: " << this << endl;
                    void *ptr = this;
                    cout << "Addrss of ptr :: " << ptr << endl;
            }
 };

 int main()
 {
    Test obj;

    cout << "Address of obj :: " << &obj << endl;

    obj.fun();

    return 0;
 }
Run Code Online (Sandbox Code Playgroud)

以上程序产生以下输出:

obj 的地址 :: 0x7ffef913627

这个地址:: 0x7ffef913627

ptr 的地址 :: 0x7ffef913627

我希望它有帮助!