vftable - 这是什么?

Mar*_* A. 5 virtual programming-languages reverse-engineering

什么是高编程语言的vftable?

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

有人可以解释一下吗?

Lig*_*ica 7

它很可能代表" 虚函数表 ",并且是一些运行时实现使用的机制,以允许虚函数调度.

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


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

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

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

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

  1. Ellis&Stroustrup 1990,pp.227-232
  2. 标题"多重继承"
  3. CodeSourcery C++ ABI


Arm*_*yan 5

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

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

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

虚拟调度实施细节