Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Programming languages vftable-这是什么?_Programming Languages_Virtual_Reverse Engineering - Fatal编程技术网

Programming languages vftable-这是什么?

Programming languages vftable-这是什么?,programming-languages,virtual,reverse-engineering,Programming Languages,Virtual,Reverse Engineering,什么是高级编程语言中的vftable 我读到的东西好像是虚拟对象结构的地址,但这是一个相当混乱的信息 有人能解释一下吗?它很可能代表“”,并且是一些运行时实现为了允许的一种机制 主流C++实现(GCC,Clang,MSVS)称之为代码> VTABs/CODE >。C没有多态性。我只能推测其他语言 以下是维基百科对这个话题的看法: 对象的调度表将包含对象的 动态绑定方法。方法调用是通过获取 对象分派表中方法的地址。调度表 对于属于同一类的所有对象都是相同的,并且 因此,它们之间通常是共享的。属于

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

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

有人能解释一下吗?

它很可能代表“”,并且是一些运行时实现为了允许的一种机制

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


以下是维基百科对这个话题的看法:

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

<> P> C++标准并没有严格规定动态调度必须是怎样的 已实现,但编译器通常在同一版本上使用较小的变体 基本模型

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

  • Ellis&Stroustrup 1990,第227-232页

  • 表在C++标准中没有明确提到,但是大多数(如果不是全部)实现使用它来实现虚拟函数。 对于每个具有虚拟函数的类,编译器都会创建一个函数POINER数组,这些POINER是指向该类虚拟函数的最后重写版本的指针。然后,每个对象都有一个指向其动态类的vtable的指针

    有关更多说明,请参见此问题及其公认的答案


    你是说某一种语言吗?有一种语言,你读过吗?你可以自己用C构建一个vtable-你的意思是“C没有多态性的语言原语”:-@Kerrek:是的;我们正在讨论“vftable”在“高级编程语言”中是什么,即作为语言的一部分。:)如果可以的话,我会把接受点一分为二,因为你的链接也给了我有用的信息