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

时间:2021-01-06 01:44:17
编译器会把一种叫虚指针(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;

}