何时为类创建v表?

rid*_*hap 4 c++ virtual-functions vptr

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

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

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

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

Pup*_*ppy 7

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

  • 当你在运行时之前不知道方法的地址时,如何在编译时发生.甚至链接器在dll中也不知道方法的地址.dll可以加载到内存中的任何位置,因此在加载dll之后才能知道地址(这是运行时操作).即使你不想重新设置dll以尝试给它们显式地址,编译器也不能保证这个地址(因为另一个dll可能会手动将数据加载到这个地址空间,从而强制转移dll). (2认同)
  • 理论上是的(为了便于初学者和实际编写过编译器的人员),我们说该表是在编译时静态创建的.不幸的是,世界上很多更复杂,这个简单的道理并没有在现实世界中托起(除了一个操作系统,我知道那建立每个DLL /应用到一个固定的位置在内存中,并且永远不会移动或卸载).实际上,v-table是在运行时构建的(可能在加载dll期间,但可以肯定地说(除了设计系统的人之外). (2认同)