3 回答
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。然后,任何不符合您的要求的编译器都不会。
干杯,……
- 3 回答
- 0 关注
- 552 浏览
添加回答
举报