虚函数表指针在对象中的位置

Ban*_*oot 5 c++ oop virtual-functions vptr

据我所知,virtual函数指针表在对象中的位置取决于编译器.
是否有任何利弊将这个指针放在对象的开头和结尾处,反之亦然?

Dav*_*eas 8

虚拟函数表的存在依赖于编译器(但所有编译器都有),并且该位置也不是强制要求的......在我知道细节的所有编译器中,vptr存储在对象的开头.原因是它提供了统一的位置.考虑一个类层次结构:

struct base {
   T data;
   virtual void f();
};
struct derived : base {
   T1 data;
   virtual void g();
};
Run Code Online (Sandbox Code Playgroud)

如果vptr存储在对象的末尾,那么sizeof(T)对于完整类型的对象,它将在字节之后base.现在当你有一个完整类型的对象时derived,base子对象的布局必须与一个完整base对象的布局兼容,所以vptr仍然必须是sizeof(T)对象内部的字节,它可能位于derived对象中间的某个位置(sizeof(T)从一开始,sizeof(T1)在结束之前).所以它不再是在对象的最后.

另外,给定this指针,虚拟调用需要通过vtable的间接,这基本上是解除引用vptr,添加偏移并跳转到存储在那里的存储器位置.如果vptr存储在对象的末尾,则对于每个虚拟调用,this在解除引用之前会有额外的添加vptr.