2014-01-12 93 views
5

在C++中,该指针作为一个隐藏的参数传递给方法,该参数实际上指向当前对象,但'this'指针存储在内存中......堆栈,堆,数据?分配'this'指针的内存

+0

假设你的意思是你的代码在调用某个方法的时候知道'this'是什么......它取决于许多因素会有所不同,但是你肯定可以猜测或者看看你的编译器产生一个想法。 – asveikau

+0

我读过'this'实际上并不是指针,它的表达是真的吗? – nilesh

+0

[存储在计算机内存中的'this'指针在哪里?](http://stackoverflow.com/questions/16585562/where-is-the-this-pointer-stored-in-computer-memory)的精确副本 –

回答

6

的标准没有规定的this指针的存储位置。

当它在该函数的调用中传递给成员函数时,一些编译器将其传递到一个寄存器中,而其他编译器则将其传递到堆栈上。它也可以依赖于编译器选项。

关于唯一可以确定的是this是一个右值的基本类型,所以你不能接受它的地址。

这并不总是那样。

在预标准C++中,您可以指定为this,例如,以指示构造函数失败。这是在引入例外之前。指示构造失败的现代标准方法是抛出一个异常,这保证了有序的清理(如果没有被用户代码挫败,例如臭名昭​​着的MFC位置new错误)。

1

在C++中,this是“简单地”指向当前对象的指针。它允许您访问特定于对象的数据。

例如,当在一个类中的代码具有以下片段:

this->temperature = 40.0f; 

它设置为任何对象被作用时的温度(假定temperature不是类级静态时,所有对象之间共享的类)。

this指针本身不必分配(就动态内存而言),它完全取决于它是如何在封面下处理的,标准实际上并未授权(标准倾向于更多地关注关于行为而不是内部)。

可能是是:在堆栈上,在特定的内存位置,在寄存器等等。所有你必须关心的是它的行为,基本上你如何使用它来访问对象。

什么this指向是对象本身,它通常分配为new动态分配,或在堆栈上。

1

这个指针被分配到你的类函数(或者有时候是一个寄存器)的堆栈中。

然而,这不太可能是您实际询问的问题。

+1

其实这似乎正是被问到的问题。尽管如此,恐怕答案太模糊了。 –

0

该指针位于对象本身*中。 排序的。它是对象的内存位置。

如果对象位于堆栈上,则此指针位于堆栈上。

如果对象位于堆上,则此指针位于堆上。

底线,没什么需要担心的。

* [更新]让我退一步/澄清/更正我的答案。该物理指针不在该对象中。

我会得出结论,这个指针是由编译器派生出来的,它只是存储在符号表中的对象的地址。在语义上,它在对象内部,但这不是OP所要求的。

这是堆栈上3个变量的内存布局。中间一个是一个对象。你可以看到它认为它是一个变量,没有别的:

enter image description here

+0

那么,如果我们计算对象的大小,那么我们应该得到这个指针的实际大小+大小,即额外4个字节..但是这并非如此 – nilesh

+0

我不认为它出现在sizeof运算符中。根据编译器的不同,指针的大小可能不同。如果你有虚函数,还有一个函数指针的隐藏表,它不会在sizeof运算符中出现。 –

+0

但我们可以看到额外的4字节分配给虚拟指针,它指向vtable – nilesh