【发布时间】:2012-09-21 14:16:37
【问题描述】:
vtable 包含指向该类的虚函数的指针。它是否也包含指向非虚函数的指针?
谢谢!
【问题讨论】:
-
首先,vtable 是一个实现细节。第二,为什么会这样?无论如何,你总是会调用相同的东西。
vtable 包含指向该类的虚函数的指针。它是否也包含指向非虚函数的指针?
谢谢!
【问题讨论】:
这是一个实现细节,但不是。如果实现将指向非虚拟函数的指针放入 vtable 中,则它不能使用这些指针进行函数调用,因为这通常会导致调用不正确的非虚拟函数。
当调用非虚拟函数时,实现必须使用正在调用该函数的对象的静态类型来确定要调用的正确函数。 vptr 访问的存储在 vtable 中的函数将取决于对象的动态类型,而不是任何静态类型的引用或访问它的指针.
【讨论】:
不,它没有。
由于可以在编译期间解析对非虚拟方法的调用(因为编译器知道非虚拟函数的地址),因此编译器会生成指令以“直接”(即静态地)调用它们。
对于编译过程中已知的方法,没有理由通过 vtable 间接机制。
【讨论】:
标准没有定义任何实现是否使用“vtable”。大多数实现都使用函数指针表,尽管指向的函数通常不是直接被调用的函数(相反,指向的函数可能会在调用实际函数之前调整指针)。
此表中是否显示非虚函数也没有标准定义。毕竟,标准甚至不需要 vtable 的存在。通常,非虚函数不在虚函数表中,因为任何必要的指针调整和调用都可以在编译或链接时解决。我可以想象一个实现类似地处理所有函数,因此在所有情况下都使用虚函数表中的指针。我不需要很受欢迎。然而,在与更灵活的对象系统无缝交互的环境中实现 C++ 可能是一种好方法,例如,可以在运行时替换单个函数的语言(我的理解是这样的事情是可能的,例如, 在 python 中)。
【讨论】:
没有。 vtable 仅包含指向同一类或文件中的虚函数的指针。
【讨论】: