何时为类创建v表?

时间:2010-11-21 17:59:30

标签: c++ virtual-functions vptr

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

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

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

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

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:4)

C++ FAQ提供了vtable机制的简化说明。您应该阅读它,尽管您可能需要查看特定的编译器文档以获取更多详细信息。

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

  • 类型的vtable是静态的,并在编译时构建
  • 每个类型实例都包含一个指针到此表
  • 由于此指针在构造时初始化,因此永远不应从构造函数
  • 调用虚拟成员函数

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我认为这是所有实施的定义,所以很难给出这个问题的通用答案。我相信vtable应该是某种静态类成员。