题
我知道,如何实现虚拟函数呼叫分辨率不属于C ++固定的一部分,也不对VPTR或V-Table说任何内容,但让我在此处问这个问题。
我听说V-Table是编译器用于实现虚拟功能调用分辨率的一种常见技术。我对此的理解是,每个过程中只需要虚拟表。
我想知道的是,什么时候为课堂创建V台?
当第一次在过程空间中创建给定类型的类(需要V台)的类(需要V台)时吗?
随后所有其他在该过程空间中创建了该类型的对象,是指已经创建的V-Table?
何时将删除此V台?
很抱歉,如果这太主观或讨论类型的问题,但是这些问题在我心中徘徊了一段时间,我觉得可以在这里问它。
解决方案
V-Table是静态分配的,从未被删除,也不明确分配。任何给定特定对象中的指针都是常数。
其他提示
这 C ++常见问题解答 提供了对VTable机制的简化解释。您应该阅读它,尽管您可能必须浏览您的特定编译器文档以获取更多详细信息。
从我的角度来看,最重要的想法是:
- 类型的VTable是静态的,并在编译时间构建
- 每个类型实例都包含一个 指针 到这张桌子
- 因为该指针是在施工时间初始初始化的,所以切勿从构造函数调用虚拟成员函数
VTable是静态数据,因此可以立即在负载下获得。顺便说一句,通常将其捆绑在汇编单元中,其中包含类上第一个非内部虚拟函数的定义(当只有一个虚拟函数为inline时,启发式会导致问题)。
我相信这都是定义的,因此很难为这个问题给出一个普遍的答案。我相信VTable应该是某种静态类成员。
不隶属于 StackOverflow