c++ - 替代虚函数调用实现?

标签 c++ virtual-functions vtable vptr

C++通过虚拟机制支持动态绑定(bind)。但据我了解,虚拟机制是编译器的一个实现细节,标准只是规定了在特定场景下应该发生的行为。大多数编译器通过虚表和虚指针来实现虚机制。这与虚拟指针和表的实现细节无关。我的问题是:

  1. 除了虚拟指针和虚拟表机制之外,是否有任何编译器以任何其他方式实现虚拟函数的动态分配?据我所见(阅读 G++、Microsoft Visual Studio)通过虚拟表、指针机制实现它。那么实际上还有其他编译器实现吗?
  2. 任何只有一个虚函数的类的 sizeof 将是该编译器上的指针(this 内的 vptr)的大小。那么假设虚拟指针和 TBL 机制本身是编译器实现,我上面的这个说法是否总是正确的?

最佳答案

对象中的 vtable 指针总是最有效的并不是真的。我的另一种语言的编译器出于类似原因过去使用对象内指针,但不再使用:相反,它使用一个单独的数据结构,将对象地址映射到所需的元数据:在我的系统中,这恰好是使用的形状信息由垃圾收集器。

此实现对于单个简单对象会花费更多的存储空间,对于具有许多基数的复杂对象更有效,对于数组大大更有效,因为在数组中所有对象的映射表。我的特定实现还可以在给定指向对象内部任何点的指针的情况下找到元数据。

实际查找速度非常快,存储要求非常适中,因为我使用了地球上最好的数据结构:Judy 数组。

我也知道没有 C++ 编译器使用 vtable 指针以外的任何东西,但这不是唯一的方法。事实上,具有基类的初始化语义使任何实现变得困惑。这是因为在构建对象时,完整的类型必须前后摇摆。由于这些语义,复杂的 mixin 对象导致生成大量虚表集、大对象和缓慢的对象初始化。这可能不是 vtable 技术的结果,而是需要盲目地遵循子对象的运行时类型始终正确的要求。实际上在构造过程中没有充分的理由这样做,因为构造函数不是方法并且不能明智地使用虚拟分派(dispatch):这对我来说不太清楚破坏,因为析构函数是真正的方法。

关于c++ - 替代虚函数调用实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10388433/

相关文章:

c++ vector在类中推回

c++ - 没有正则表达式库的简单正则表达式?

c++ - 打印数组是否溢出

c++ - 非平凡的复制构造函数有什么作用?

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

c++ - 类的对象(使用单/多继承)有多少个 vptr?

c++ - Lua:多次调用返回字符串的 Lua 函数。如何做到这一点,以便有交叉到下一个实例的字段

c++ - 混淆是指针和虚函数的内存分配

c++ - 无法理解 C++ `virtual`

c++ - g++ -fdump-class-hierarchy 的输出中的第一个 (int (*)(...))0 vtable 条目是什么?