C++ 替代虚拟函数调用实现?
C++通过虚拟机制支持动态绑定。但据我所知,虚拟机制是编译器的一个实现细节,标准只是指定了在特定场景下应该发生的行为。大多数编译器通过虚拟表和虚拟指针实现虚拟机制。这与虚拟指针和表的实现细节无关。我的问题是:C++ 替代虚拟函数调用实现?,c++,virtual-functions,vtable,vptr,C++,Virtual Functions,Vtable,Vptr,C++通过虚拟机制支持动态绑定。但据我所知,虚拟机制是编译器的一个实现细节,标准只是指定了在特定场景下应该发生的行为。大多数编译器通过虚拟表和虚拟指针实现虚拟机制。这与虚拟指针和表的实现细节无关。我的问题是: 除了虚拟指针和虚拟表机制之外,是否有任何编译器以任何其他方式实现虚拟函数的动态分派?据我所知,大多数(读G++,MicrosoftVisualStudio)是通过虚拟表、指针机制实现的。那么实际上还有其他编译器实现吗 任何仅具有虚拟函数的类的sizeof都将是该编译器上指针的大小(vptr
sizeof
都将是该编译器上指针的大小(vptr insidethis
)。既然虚拟指针和TBL机制本身就是编译器实现,那么我上面所说的这句话会永远正确吗这是一个可能的优化,因为C++是静态类型检查的。 在一些更具动态性的语言中,在基类链上有一个动态搜索,从对象的最派生类开始搜索虚拟调用的成员函数的实现。例如,这就是它在最初的Smalltalk中的工作原理。C++标准描述了虚拟调用的效果,就好像使用了这样的搜索。 在20世纪90年代的Borland/Turbo Pascal中,这种动态搜索用于查找Windows API“窗口消息”的处理程序。我认为在Borland C++中可能也是一样的。它是对普通vtable机制的补充,仅用于消息处理程序
如果它在Borland /Turbo C++中使用——我记不起来了,那么它支持一个语言扩展,允许你把消息ID和消息处理函数联系起来。 任何只有一个虚函数的类的sizeof都将是该编译器上指针的大小(this中的vptr),因此假设虚ptr和tbl机制本身就是编译器实现,那么我上面所说的这句话是否总是正确的
从形式上说,没有(即使假设有vtable机制),这取决于编译器。由于该标准不需要vtable机制,因此它没有说明每个对象中vtable指针的位置。其他规则允许编译器在末尾自由添加填充,即未使用的字节 但在实践中也许是这样 然而,这不是你应该依赖的东西,也不是你需要依赖的东西。但在另一个方向上,您可以要求这样做,例如,如果您正在定义ABI。然后if (auto frobj = dynamic_cast<FrequentlyOccurringType>(obj)) {
frobj->FrequentlyOccurringType::method(); // static dispatch on hot path
} else {
obj->method(); // vtable dispatch on cold path
}
Local anInfo->x = 5
Local anInfo->_get_x() = 5
Local anInfo->y = A
Local anInfo->_get_y() = B
{An instance of class info at address 0092E318
}