除了虚拟指针和虚拟表机制之外,是否有任何编译器以任何其他方式实现虚拟机制?据我所见,大多数(读g++,Microsoft Visual Studio)通过虚拟表、指针机制实现它。那么实际上还有其他编译器实现吗?
我所知道的所有当前编译器都使用 vtable 机制。
这是一种可能的优化,因为 C++ 是静态类型检查的。
在一些更动态的语言中,会在基类链上进行动态搜索,从对象的最派生类开始搜索被虚拟调用的成员函数的实现。例如,这就是它在最初的 Smalltalk 中的工作方式。C++ 标准描述了虚拟调用的效果,就好像使用了这种搜索一样。
在 1990 年代的 Borland/Turbo Pascal 中,这种动态搜索被用于查找 Windows API“窗口消息”的处理程序。我认为在 Borland C++ 中可能也是如此。它是对普通 vtable 机制的补充,仅用于消息处理程序。
如果它在 Borland/Turbo C++ 中使用——我不记得了——那么它支持一种语言扩展,允许你将消息 ID 与消息处理函数相关联。
任何只有一个虚函数的类的大小将是该编译器上一个指针(this 中的 vptr)的大小,因此,鉴于虚拟 ptr 和 tbl 机制本身就是编译器实现,我在上面所做的这个陈述是否总是正确的?
形式上没有(即使假设 vtable 机制),它取决于编译器。由于标准不需要 vtable 机制,它没有说明 vtable 指针在每个对象中的位置。其他规则允许编译器在末尾自由添加填充、未使用的字节。
但在实践中也许。;-)
但是,这不是您应该依赖或需要依赖的东西。但在另一个方向上,您可以要求这样做,例如,如果您正在定义 ABI。然后任何不符合您要求的编译器。
干杯&hth.,