替代的虚函数调用实现?

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

  1. 除了虚拟指针和虚拟表机制以外,是否有任何编译器以其他方式实现虚拟函数的动态分配?据我所知(通过阅读G ++,Microsoft Visual Studio),大多数人都是通过虚拟表指针机制来实现的。那么实际上还有其他编译器实现吗?

  2. sizeof只是一个虚拟函数的任何类的将是一个指针(vptr的内部的大小this在该编译器)。因此,既然虚拟指针和TBL机制本身就是编译器实现,那么我在上面所做的声明是否总是正确的?


精慕HU
浏览 553回答 3
3回答

慕码人2483693

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