问题标签 [vtable]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
12 回答
62956 浏览

c++ - 虚函数和vtable是如何实现的?

我们都知道 C++ 中的虚函数是什么,但是它们是如何在深层次上实现的呢?

可以在运行时修改甚至直接访问 vtable 吗?

vtable 是否存在于所有类,还是只存在于至少具有一个虚函数的类?

抽象类是否只是为至少一个条目的函数指针设置了一个 NULL 值?

拥有一个虚函数会减慢整个班级的速度吗?还是只调用虚拟函数?如果虚拟功能实际上是否被覆盖,速度是否会受到影响,或者只要它是虚拟的就没有影响。

0 投票
6 回答
2086 浏览

c++ - QAbstractTableModel继承vtable问题

这是 qt 的另一个问题:我扩展了 QAbstractTableModel,但出现编译错误(我正在使用 cmake)

当我编译时,我得到:

TableModel': /partd/unusedsvn/unusedpkg/iface/tableModel.cpp:4: undefined reference toTableModel' /partd/unusedsvn/unusedpkg/iface/tableModel.cpp:4 的函数 vtable 中:未定义引用vtable for TableModel' collect2: ld returned 1 exit status

有人遇到同样的问题吗??

0 投票
6 回答
31453 浏览

c# - 虚函数在 C# 和 Java 中如何工作?

虚函数如何在 C# 和 Java 中工作?

它是使用类似于 C++ 的相同 vtable 和 vpointer 概念还是完全不同的东西?

0 投票
9 回答
12856 浏览

c++ - 虚拟类的每个对象是否都有指向 vtable 的指针?

虚拟类的每个对象是否都有指向 vtable 的指针?

还是只有带有虚函数的基类对象才有?

vtable 存储在哪里?进程的代码部分或数据部分?

0 投票
6 回答
1132 浏览

c++ - VS2005 C++ 损坏的 vtables

我目前正在开发一个相当大(而且很旧,叹气)的代码库,最近升级到 VS2005 (SP1)。我和我的团队正在更改/更新/替换此代码中的模块,但我们偶尔会遇到 vtables 似乎损坏的问题。我不是 vtables 方面的专家,但这些肯定似乎被打破了。错误表现为以下错误:

运行时检查失败 #0 - ESP 的值未在函数调用中正确保存。这通常是调用使用一种调用约定声明的函数和使用另一种调用约定声明的函数指针的结果。

当然,这个错误可能还有很多其他原因,但是在调试(调试构建)时,我实际上可以验证我想要操作的对象的 vtables 看起来很奇怪:

引用每个 vtable 的堆栈和堆看起来都很好,并且指向 vtable 的指针与映射文件完美匹配。这向我表明这不是内存覆盖错误或类似错误,因为它会影响堆栈和堆而不是存储 vtable 的位置。(它们存储在只读区域对吗?)无论如何,到目前为止一切似乎都很好。但是当查看 vtable 的内存时,我发现所有值,如果我将它们解释为指针,尽管它们在同一范围内(例如 0x00f203db 0x00f0f9be 0x00ecdda7 0x00f171e1)不匹配映射文件中的任何条目,其中许多条目甚至没有对齐到 4 个字节。我不知道 VS2005 如何构建 vtables 的所有细节,但这在我看来是错误的。如果这是正确的行为,也许有人可以向我解释一下?

我想我的问题归结为什么会导致这种行为?例如,当类层次结构过于复杂时,链接器中是否存在已知错误?有没有人见过类似的东西?目前,我们能够通过将函数从受影响的类移动到内联(可怕的东西!)来解决我们的崩溃问题,但显然这不是一个可行的长期解决方案。

感谢您的任何见解!

更新:有人问我有关该项目的更多详细信息,我当然会提供。然而,首先,问题与 ESP 值未保存错误并不完全相关。我最感兴趣的是为什么我会在 vtable 中看到奇怪的值。也就是说,这里有一些附加信息:该解决方案依赖于几个外部和内部项目,但这些项目很长时间没有改变,都使用相同的调用约定。它似乎中断的代码都在解决方案的一个非常标准的 C++“主”项目中。所有代码都使用相同的编译器构建。该解决方案也不使用任何 dll,而是使用大量静态库链接:

SHFolder.lib、python25.lib、dxguid.lib、d3d9.lib、d3dx9.lib、dinput8.lib、ddraw.lib、dxerr9.lib、ws2_32.lib、mss32.lib、Winmm.lib、vtuneapi.lib、vttriggers。 lib,DbgHelp.lib,kernel32.lib,user32.lib,gdi32.lib,winspool.lib,comdlg32.lib,advapi32.lib,shell32.lib,ole32.lib,oleaut32.lib,uuid.lib,odbc32.lib, odbccp32.lib

0 投票
1 回答
3457 浏览

interface - 托管 C++ 中的接口类

托管 C++ 中的接口对我来说有点奇怪,因为它们允许在其中使用静态方法和成员。例如,以下是一个有效的 MC++ 接口。

好吧,我的问题是接口中静态方法的用途是什么。以及虚拟表等发生了什么。实现此接口的类的虚拟表将是什么。有很多问题浮现在脑海。这种类型的类,即接口类不等同于普通的抽象类,因为我们不能在这里定义非静态方法。

我只想知道在界面中允许静态的智慧。这肯定违反了 IMO 的 OOP 原则。

0 投票
0 回答
142 浏览

com - vtable 有问题——是我还是图书馆?

我正在尝试使用一个使用 vtable 的 COM 库。然而,在我调用函数之后,堆栈发生了一些奇怪的事情,这告诉我我做错了什么。

带有 vtable 定义的头文件粘贴在此处:pastebin.com/m2d66c18c(特别参见从第 810 行开始的代码)。此处粘贴了一个示例:pastebin.com/m1b46e662

该表正在填充函数的正确位置,但是当我调用函数时,它们似乎在错误的位置查找堆栈上的参数。此外,在调用表中的函数后,堆栈被弄乱了,我的程序崩溃了。我尝试将函数类型更改为两者__cdecl__stdcall但这无济于事。

要么是我的代码,要么是库,编写库的公司还没有回复我——因为这是周末,我假设。此外,还有一个使用该库的演示应用程序,它可以工作——所以我认为这是我的代码/编译器 (gcc)/其他东西,而不是库。

是不是为了使用 COM 库,您需要做一些特别的事情?

0 投票
2 回答
2246 浏览

c++ - 使用 v-table thunk 链接过程调用

我在网上阅读了一些关于 Vtable thunk 的文章,我在某处读到了 thunk 可用于挂钩 /chain 过程调用。

它可以实现吗?

有谁知道它是如何工作的,我也找不到解释 thunk 的好资源。对此有什么建议吗?

0 投票
2 回答
1233 浏览

c++ - 派生、具体、类的 vtables

如果我有一个基类并从中派生 10 个不同的具体派生类,那么每个具体派生类都会有不同的 vtable 吗?

0 投票
4 回答
10019 浏览

c++ - 虚函数和多继承情况下的对象布局

我最近在一次采访中被问及涉及虚拟功能和多重继承的对象布局。
我在上下文中解释了它是如何在不涉及多重继承的情况下实现的(即编译器如何生成虚拟表,在每个对象中插入指向虚拟表的秘密指针等等)。
在我看来,我的解释中缺少一些东西。
所以这里有问题(见下面的例子)

  1. C类对象的确切内存布局是什么。
  2. C 类的虚拟表条目。
  3. A、B 和 C 类对象的大小(由 sizeof 返回)。(8、8、16 ??)
  4. 如果使用虚拟继承会怎样。肯定会影响大小和虚拟表条目吗?

示例代码:

谢谢!