虚拟表的说明

时间:2012-10-27 12:46:17

标签: c++ gcc g++ vtable

  

可能重复:
  Understanding the vtable entries

使用g ++版本4.6.3,64位计算机。我知道编译器可以随心所欲地实现虚函数。我想知道这里发生了什么。

我的课程:

#include <iostream>
class test
{
    public:
    virtual void func(){std::cout<<"in class test";}
};

int main()
{
    test obj;
    obj.func();
    return 0;
}

查看编译器生成的虚拟表,

Vtable for test
test::_ZTV4test: 3u entries
0     (int (*)(...))0 (<---- what is this? )
8     (int (*)(...))(& _ZTI4test)
16    (int (*)(...))test::func

在偏移8处,它是RTTI

在偏移量16处,它是虚拟功能的输入。

我的问题是为什么在偏移0处有空的条目,或者换句话说第一次进入的目的是什么?

P.S。我认为这可能与对齐有关,但后来我添加了更多虚函数,但RTTI条目仍然是偏移8。

1 个答案:

答案 0 :(得分:8)

我相信第一个条目或0的条目是顶部指针的偏移量。

请参阅the following relevant stackoverflow question

从源代码中查看余数-fdump-class-hierarchy,大多数类看起来第一个条目为(int (*)(...))0,唯一没有它的类作为第一个条目拥有它作为第二个,并且在给定流的C ++ STL类层次结构的情况下将第一个条目作为父类的偏移量。

在相关问题中,给出了一些vtable示例的死链接,我相信该链接的实时版本可用here

详细介绍vtable结构的另一个有用资源是here