class 中不相关的虚函数 Table 条目

Virtual Function Table entry from class that is not related

我正在浏览一个简单的 C++ Windows 程序的 VFT (VMT)(我没有源代码,只有二进制文件),由 Visual Studio 编译,并进行了某种优化.

我注意到它使用了继承和多态性。我为程序的每个 class 找到了 struct s_RTTIBaseClassArray 的位置。在那个位置有一个指向结构 _s_RTTIBaseClassDescriptor 的指针数组。基本 class 描述符数组应该为您提供有关当前 class 派生自的所有 class 的信息。

虚函数(方法)Table是一个table,包含指向当前class的所有虚函数的指针。然而,在一些 classes 的 VFT 中,我发现了一个指向虚拟方法的指针,它实际上属于另一个 class ,即(根据 Base Class Array)与当前不相关class。下面的示例:

ClassA_BaseClassArray:
            dd offset ClassA_BaseClassDescriptor
            dd offset ClassB_BaseClassDescriptor ; ClassA inherits from ClassB

ClassB_BaseClassArray:
            dd offset ClassB_BaseClassDescriptor

ClassC_BaseClassArray:
            dd offset ClassC_BaseClassDescriptor

ClassA_VMT: 
            dd offset ClassA_VM1 ; virtual method of ClassA
            dd offset ClassA_VM2
            dd offset ClassB_VM2 ; virtual method of ClassB - override
            dd offset ClassC_VM3 ; virtual method of ClassC - NOTHING TO DO HERE
            dd offset ClassA_VM3

例子很短,实际classes有更多的虚拟方法。

检查 ClassC_VM3 后我注意到,它只包含两条​​指令:

mov    eax, [ecx+10h]
retn

到目前为止,我发现了大约3个与此示例类似的VMT,无关的方法总是这么短。

我的问题是:这是什么原因造成的?难不成ClassC_VM3的代码和某个ClassA方法的代码一样,所以编译器直接优化掉了?

这可能是由 COMDAT folding 引起的,这是一种将具有完全相同的机器代码的函数合并为一个的优化。由于它是如此简单的功能,所以它的机会很大。