vftable - 这是什么?

时间:2011-07-12 12:42:55

标签: programming-languages virtual reverse-engineering

高编程语言中的vftable是什么?

我读了类似虚拟对象结构的地址,但这是一个非常混乱的信息

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:7)

它很可能代表“Virtual Function Table”,并且是某些运行时实现使用的机制,以允许virtual function dispatch

主流C ++实现(GCC,Clang,MSVS)将其称为vtable。 C没有多态性。我只能推测其他语言。


以下是维基百科关于该主题的内容:

  

对象的调度表将包含对象的地址   动态绑定方法。通过获取方法调用来执行   对象的调度表中方法的地址。调度表   对于属于同一个类的所有对象都是相同的,并且是   因此通常在他们之间共享。属于的对象   类型兼容的类(例如继承中的兄弟节点)   层次结构)将具有相同布局的调度表:地址   对于所有方法,给定方法的出现在同一偏移处   类型兼容的类。因此,从a获取方法的地址   给定调度表偏移量将获得对应的方法   对象的实际类。 [1]

     

C ++标准并未明确规定动态调度必须如何   实现,但编译器通常使用相同的微小变化   基本模型。

     

通常,编译器为每个类创建一个单独的vtable。什么时候   创建一个对象,一个指向此vtable的指针,称为虚拟对象   表指针,vpointer或VPTR被添加为此隐藏成员   对象(成为它的第一个成员,除非它是最后的 [2] )。该   编译器还在每个类的构造函数中生成“隐藏”代码   将其对象的vpointers初始化为。的地址   相应的vtable。请注意,vpointer的位置   对象实例在所有编译器中都不是标准的,并且依赖于   该位置可能导致不可移植的代码。例如,g ++   之前将vpointer放在对象的末尾。 [3]

  1. Ellis& Stroustrup 1990,pp.227-232
  2. Heading "Multiple Inheritance"
  3. CodeSourcery C++ ABI

答案 1 :(得分:2)

在C ++标准中没有明确提到Vftable,但大多数(如果不是全部)实现都将它用于虚函数实现。

对于具有虚函数的每个类,编译器会创建一个函数poiners数组,这些函数poiners是指向该类虚函数的最后一个覆盖版本的指针。然后每个对象都有一个指向其动态类的vtable的指针。

请参阅此问题及其接受的答案以获取更多插图

Virtual dispatch implementation details