4

我知道,如何实现虚函数调用解析不是 C++ 标准的一部分,也不是关于 vptr 或 v-table 的任何内容,但让我在这里问这个问题。

我听说 v-table 是编译器用来实现虚函数调用解析的常用技术。我对此的理解是,每个类、每个进程只需要一个虚拟表。

我想知道的是,什么时候为一个类创建 v-table?
是第一次在进程空间中创建给定类型的类(需要 v-table)时吗?
在该进程空间中所有其他随后创建的该类型的对象,是指已经创建的 v-table?
这个 v-table 什么时候会被删除?

如果这是太主观或讨论类型的问题,我很抱歉,但这些问题在我脑海中萦绕了一段时间,我觉得在这里问它是可以的。

4

4 回答 4

7

v-table 是静态分配的,永远不会被删除,也不是显式分配的。任何给定特定对象内的指针都是常量。

于 2010-11-21T18:03:51.697 回答
4

C++ FAQ提供了 vtable 机制的简化解释。您应该阅读它,尽管您可能必须通过您的特定编译器文档了解更多详细信息。

从我的角度来看,最重要的想法:

  • 类型的 vtable 是静态的,并且在编译时构建
  • 每个类型实例都包含一个指向该表的指针
  • 因为这个指针是在构造时初始化的,所以永远不应该从构造函数中调用虚成员函数
于 2010-11-21T18:06:21.410 回答
1

vtable 是静态数据,因此在加载时立即可用。顺便说一句,它通常捆绑在编译单元中,其中包含类上第一个非内联虚函数的定义(当只有一个内联虚函数时,启发式会导致问题)。

于 2010-11-21T18:04:27.393 回答
0

我相信这都是定义的实现,所以很难对这个问题给出一个普遍的答案。我相信 vtable 应该是某种静态类成员。

于 2010-11-21T18:05:22.657 回答