我知道,如何实现虚拟函数呼叫分辨率不属于C ++固定的一部分,也不对VPTR或V-Table说任何内容,但让我在此处问这个问题。

我听说V-Table是编译器用于实现虚拟功能调用分辨率的一种常见技术。我对此的理解是,每个过程中只需要虚拟表。

我想知道的是,什么时候为课堂创建V台?
当第一次在过程空间中创建给定类型的类(需要V台)的类(需要V台)时吗?
随后所有其他在该过程空间中创建了该类型的对象,是指已经创建的V-Table?
何时将删除此V台?

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

有帮助吗?

解决方案

V-Table是静态分配的,从未被删除,也不明确分配。任何给定特定对象中的指针都是常数。

其他提示

C ++常见问题解答 提供了对VTable机制的简化解释。您应该阅读它,尽管您可能必须浏览您的特定编译器文档以获取更多详细信息。

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

  • 类型的VTable是静态的,并在编译时间构建
  • 每个类型实例都包含一个 指针 到这张桌子
  • 因为该指针是在施工时间初始初始化的,所以切勿从构造函数调用虚拟成员函数

VTable是静态数据,因此可以立即在负载下获得。顺便说一句,通常将其捆绑在汇编单元中,其中包含类上第一个非内部虚拟函数的定义(当只有一个虚拟函数为inline时,启发式会导致问题)。

我相信这都是定义的,因此很难为这个问题给出一个普遍的答案。我相信VTable应该是某种静态类成员。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top