在C ++中,这个指针作为隐藏参数传递给方法,它实际指向当前对象,但是'this'指针存储在内存中...堆栈,堆,数据在哪里?
答案 0 :(得分:6)
标准没有指定this
指针的存储位置。
当它在该函数的调用中传递给成员函数时,一些编译器将它传递给寄存器,而其他编译器将它传递给堆栈。它还可以取决于编译器选项。
关于唯一可以肯定的是,this
是基本类型的右值,因此您无法获取其地址。
并非总是如此。
在预标准C ++中,您可以分配给this
,例如为了表示构造函数失败。这是在引入例外之前。指示构造失败的现代标准方法是抛出异常,这保证了有序清理(如果没有被用户的代码挫败,例如臭名昭着的MFC放置new
错误)。
答案 1 :(得分:1)
在C ++中,this
是“简单地”指向当前对象的指针。它允许您访问特定于对象的数据。
例如,当类中的代码具有以下代码段时:
this->temperature = 40.0f;
它设置任何对象的温度(假设temperature
不是类级静态,在类的所有对象之间共享)。
this
指针本身不需要分配(就动态内存而言),它完全取决于它是如何在封面下处理的,标准实际上没有强制要求(标准倾向比内部更多地关注行为。)
可以可以有多少个地方:堆栈,特定内存位置,寄存器等等。所有你必须关心的是它的行为,基本上就是你如何使用它来访问对象。
this
指向的是对象本身,它通常用new
分配给动态分配,或者在堆栈上。
答案 2 :(得分:1)
this指针分配在类函数的堆栈上(或者有时是寄存器)。
然而,这不是你实际问的问题。
答案 3 :(得分:0)
this指针位于对象本身*中。 排序。它是对象的内存位置。
如果对象在堆栈上,则该指针位于堆栈上。
如果对象在堆上,则this指针位于堆上。
最重要的是,你无需担心。
* [更新]让我回复/澄清/纠正我的回答。物理this指针不在对象中。
我会得出结论,这个指针是由编译器派生的,它只是存储在符号表中的对象的地址。在语义上,它在对象内部,但这不是OP所要求的。
这是堆栈上3个变量的内存布局。中间的是一个对象。你可以看到它拥有一个变量,而不是其他任何东西: