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

2024-01-19

据我了解,该位置virtual对象中的函数指针表取决于编译器。
将此指针放置在对象的开头与结尾或反之亦然是否有任何优点/缺点?


虚函数表的存在与编译器相关(但所有编译器都如此),并且位置也没有强制...在我了解详细信息的所有编译器中,vptr 存储在对象的开头。原因是它提供了统一的位置。考虑一个类层次结构:

struct base {
   T data;
   virtual void f();
};
struct derived : base {
   T1 data;
   virtual void g();
};

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

另外,给定一个this指针,虚拟调用需要通过 vtable 进行间接访问,这基本上是取消引用vptr,添加偏移量并跳转到存储在那里的内存位置。如果vptr存储在对象的末尾,对于每个虚拟调用,都会有一个额外的添加this在取消引用之前vptr.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

虚函数表指针在对象中的位置 的相关文章

随机推荐