深度探索C++对象模型 虚函数表指针问题

《深度探索C++对象模型》中文版116页,
“某些编译器设计了一种优化技术,只要第二个(或后继)base class声明了一个virtual function,而第一个base class没有,就把多个base classes的顺序调换。这样可以在derived class object中少产生一个vptr”
vptr是如何减少的,想不明白,跪求解答

3个回答

没有虚函数的基类就不需要vptr了

这个涉及虚表的实现,当一个类继承多个类的时候,例如
class b
{
int g;
virtual void h();
}
class c
{
int t;
}
class a : public b, public c
{
int i;
virtual void f();
}
那么在a中就有两个段,继承自b类的数据段和继承自c类的数据段,也就意味着a类中有俩个地址段。
编译器是如何实现在a类中数据段c中的t成员的查找呢?首先
a* j = new a;
c* s = j;
int k = s->t;
j变量转换成s变量的时候,其实是发生了地址偏移的,比如变量j起始地址是0x234,那么j中b类数据段的起始地址也就是0x234,但是c类数据段就是
0x234 + sizeof(b);基于这个原因,所以在类a中要用类c的虚函数,就必须先将地址偏移到类c数据段,找到虚表指针,然后调用。
第一个基类和当前类公用一个虚表指针。节省虚表指针有个前提,就是子类必须有虚函数,如果没有不管怎么换顺序,结果是一样的

从编译器的角度分析,是为了减少内存的浪费。 如果base class中有vitual func,那么derive class后会继承base class的vptr和虚函数表,如果没有就不会继承。现在的编译器都是这样优化的,不用太在意,理解就行

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问