为了账号安全,请及时绑定邮箱和手机立即绑定

替代的虚函数调用实现?

替代的虚函数调用实现?

C++
精慕HU 2019-11-28 10:06:36
C ++通过虚拟机制支持动态绑定。但是据我了解,虚拟机制是编译器的实现细节,而该标准仅指定了在特定情况下应发生的行为。大多数编译器通过虚拟表和虚拟指针来实现虚拟机制。这与虚拟指针和表的实现细节无关。我的问题是:除了虚拟指针和虚拟表机制以外,是否有任何编译器以其他方式实现虚拟函数的动态分配?据我所知(通过阅读G ++,Microsoft Visual Studio),大多数人都是通过虚拟表指针机制来实现的。那么实际上还有其他编译器实现吗?的sizeof只是一个虚拟函数的任何类的将是一个指针(vptr的内部的大小this在该编译器)。因此,既然虚拟指针和TBL机制本身就是编译器实现,那么我在上面所做的声明是否总是正确的?
查看完整描述

3 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

除了虚拟指针和虚拟表机制之外,是否有任何编译器以其他方式实现虚拟机制?据我所见,大多数(阅读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。然后,任何不符合您的要求的编译器都不会。


干杯,……


查看完整回答
反对 回复 2019-11-28
  • 3 回答
  • 0 关注
  • 552 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信