2011-07-12 45 views
5

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

我读的东西就像是一个虚拟对象结构的地址,但是这是一个相当混乱的信息

可有人请解释一下吗?

+0

你是一个特别的语言的接受的答案? –

+3

有[维基百科上的文章](http://en.wikipedia.org/wiki/Vtable),你有没有读过? –

回答

6

它最有可能代表“Virtual Function Table”,并且是为了允许virtual function dispatch在某些运行时实现中使用的机制。

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


这里是维基百科说的话题:

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

C++的标准没有要求准确动态调度必须如何 实现,但是编译器通常使用在相同 基本模型的微小变化。

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

  1. 埃利斯& Stroustrup的1990,第227-232
  2. Heading "Multiple Inheritance"
  3. CodeSourcery C++ ABI
+0

你总是可以在C中自己构建一个vtable - 你的意思是说“C没有多态性的语言原语”:-) –

+0

@Kerrek:是的;我们正在讨论什么是“vFtable”将是“高级编程语言”,即作为语言的一部分。 :) –

2

Vftable未明确地在C++标准所提到的,但大多数(如果不是全部)实现将其用于虚拟功能实现。

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

见这个问题,并为更多的插图

Virtual dispatch implementation details

+0

如果可以的话,我会将接受点分成两半,因为你的链接也给了我有用的信息 –