您的位置:首页 > 编程语言 > C语言/C++

[C++ MFC VC] 虚函数表指针的位置

2008-01-10 08:58 288 查看
编译器会把一种叫虚指针(vptr)的隐藏数据插入到至少拥有一个虚函数的类中。 vptr 是一种指向虚函数地址列表的指针。在不同编译器中, vptr 所在位置是不同的。

一些编译器(例如:Visual C++ 和 C++ Builder)把 vptr 放置在类的开头部分,在所有用户声明的数据成员的前面。而另一些编译器,像GCC 和 DEC CXX,把 vptr 放在类的结尾部分,在所有用户声明的数据成员的后面。

通常,你不用关心 vptr 位置所在。尽管如此,在某些条件下,在使对象序列化的程序中,vptr 的位置所在还是有些不同影响的。

如何找到vptr 了?首先,得到那个类的一个对象实例的地址,然后把这个地址与同一个对象实例的第一个数据成员的地址相比较。如果两者相同,那么, vptr 就有可能是在末尾;如果后者的数值比前者大的话,那么, vptr 就是放在开头部分了。

用下面的程序来查明你的编译器把 vptr 放置在何处的:

class A

{

public:

virtual void f() {}

int n;

};

int main()

{

A a;

char* p1 = reinterpret_cast<char*>(&a);

char* p2 = reinterpret_cast<char*>(&a.n);

if(p1 == p2)

cout << “vptr is located at the object’s end” << endl;

else

cout << “vptr is located at the object’s beginning” << endl;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: