高编程语言中的vftable是什么?
我读了类似虚拟对象结构的地址,但这是一个非常混乱的信息
有人可以解释一下吗?
答案 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 :(得分:2)
在C ++标准中没有明确提到Vftable,但大多数(如果不是全部)实现都将它用于虚函数实现。
对于具有虚函数的每个类,编译器会创建一个函数poiners数组,这些函数poiners是指向该类虚函数的最后一个覆盖版本的指针。然后每个对象都有一个指向其动态类的vtable的指针。
请参阅此问题及其接受的答案以获取更多插图