C++:一个虚函数表是否包含指向非虚函数的指针?

12

vtable(虚函数表)包含指向该类的虚函数的指针。它是否还包含指向非虚函数的指针呢?

谢谢!


5
首先,vtable 是实现细节。其次,为什么要这样做呢?你总是会调用同一件事情。 - Xeo
4个回答

13

这只是一些实现上的细节,但并不会这样做。如果一个实现将非虚函数的指针放入 vtable 中,那么它不能使用这些指针进行函数调用,因为这通常会导致调用错误的非虚函数。

当调用非虚函数时,实现必须使用正在调用该函数的对象的静态类型来确定正确的函数调用。存储在通过 vptr 访问的 vtable 中的函数将依赖于对象的动态类型,而不是任何通过它进行访问的引用或指针的静态类型。


5
不,它不会。
由于编译器知道非虚拟函数的地址,因此可以在编译期间解析对非虚拟方法的调用,编译器生成指令以直接(即静态地)调用它们。
对于在编译期已知的方法,没有必要通过vtable间接机制进行调用。

2
没有。一个虚函数表只包含同一类或文件中的虚函数指针。

2
标准并未定义任何实现是否使用“虚函数表”(vtable)。大多数实现使用一个函数指针表,尽管所指向的函数通常不是直接被调用的(相反,在调用实际函数之前,所指向的函数可能会调整指针)。
非虚函数是否出现在此表中也没有被标准定义。毕竟,标准甚至不要求存在虚函数表。通常情况下,非虚函数不在虚函数表中,因为任何必要的指针调整和调用可以在编译或链接时解决。我可以想象一种实现方式以相似的方式处理所有函数,并在所有情况下使用虚函数表中的指针。然而,这可能不会得到广泛的认可。但是,在与更灵活的对象系统无缝交互的环境中实现C++可能是一种好方法,例如可以在运行时替换单个函数的语言中(我的理解是Python中可能存在这样的情况)。

实际上,是否有已知的不使用虚函数表的实现?(我知道它们不必须使用,只是好奇) - jcoder
我不知道有任何不使用嵌入指针的实现。 - Dietmar Kühl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接