为什么指向虚函数表的指针会影响类的大小,但是这个指针不会影响类的大小?在哪里放置这个指针和 什么时候分配内存?
答案 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
驻留(x
和y
为int
)。取决于
实现,它真正驻留的地方会有所不同:VC ++,for
倾向于将其保留在ECX寄存器中(尽管可能会这样)
使用优化时会有所不同); Sun CC for Sparc将其列入
注册i0
等等。不是成员,甚至是隐含的成员
类。它可能最好被认为是一个论据
功能,虽然许多编译器会特别对待它,并且
与普通参数不同,它不是左值。