在哪里放置这个指针,并在为它分配内存时?

时间:2013-10-22 09:35:49

标签: c++ memory-management this

为什么指向虚函数表的指针会影响类的大小,但是这个指针不会影响类的大小?在哪里放置这个指针和 什么时候分配内存?

5 个答案:

答案 0 :(得分:5)

它作为隐式参数传递,因此它不存储在对象内部。当你写:

struct X
{
    void f( int i );
};

X x;
x.f( 42 );

你可以这样想:

void f( X* const this, int i ); // of course this would be illegal as "this" is a keyword

f( &x, 42 );

所以this - 指针来自调用方法的位置。

答案 1 :(得分:3)

指向虚函数表的指针存储在对象中,但this实际上是成员函数的隐藏参数。实际上,当你有这个:

class X
{
  void foo(int bar) const;
};

int main()
{
  X x;
  x.foo(7);
}

然后编译器将隐式地将其转换为类似的东西(伪代码):

class X
{
  static void foo(const X * const this, int bar);
};

int main()
{
  X x;
  X::foo(&x, 7);
}

请注意,我仅显示伪代码以用于说明目的。你可以在概念上想象它,但它并不是实际发生的事情。

答案 2 :(得分:1)

this指针隐式放在堆栈上(它就像是方法的参数)。因此,当您调用obj->foo()时,您隐式将obj传递给方法foo。编译器允许您通过this访问该参数。

通常,无论如何都不需要将此指针存储在对象中。这将是多余的(即,如果你能抓住对象,它的地址已经可用)。

vTable然而却是另一回事。在编译时无法知道对象指向哪个vtable,也没有单独的隐式参数。这需要对象本身的专用空间。

答案 3 :(得分:1)

与'this'指针类似,vptr取决于实例而不是类。

答案 4 :(得分:1)

无处。 this指针不是左值,不占用 记忆本身。这有点像问问结果在哪里 x + y驻留(xyint)。取决于 实现,它真正驻留的地方会有所不同:VC ++,for 倾向于将其保留在ECX寄存器中(尽管可能会这样) 使用优化时会有所不同); Sun CC for Sparc将其列入 注册i0等等。不是成员,甚至是隐含的成员 类。它可能最好被认为是一个论据 功能,虽然许多编译器会特别对待它,并且 与普通参数不同,它不是左值。