c++中派生类对象的内存布局


主要从三个方面讲
1.单一继承
2.多重继承
3.虚拟继承

1.单一继承
(1)派生类完全拥有基类的内存布局,并保证其完整性
派生类可以看做是完整的基类的object再加上派生类自己的object。如果基类中
没有虚成员函数,那么派生类与具有相容功能的非派生类将不带来任何性能上
的差异,另外,一定要保证基类的完整性,实际内存布局由编译器自己决定
vs里,把虚拟指针放在最前面,接着是基类的对象,最后是派生类自己的对象
class A
{
int b;
char c;
};
class A1 : public A 
{

char a;

};
int main()
{
cout << sizeof( A ) << "" <<sizeof( A1 ) << endl;
return 0;
}

输出 8   12 
A类的话 一个 int ,一个char ,5个字节,内存对齐一下,8个字节
A1的话,一个int  两个char,要保证对象的完整性,那么一定保证A1类
前面的几个自己一定要与A类完全一样,也就说,A类作为内存不起的3个字节
也是要出现在A1里面的,、

(2)虚指针怎么处理、
还是视编译器而定,VS是永远把vptr放在对象的最前面。如果基类中含有虚函数那么
处理情况与上边一样,可以,如果基类中没有虚函数而派生类有的话,
那么如果把vptr放在派生类的前面的话,将会导致派生类中基类成分并不在最前面,这将
带来什么问题呢?举例:假设A不含虚,而A1含
A *pa;
A1 obj_A1;
pa  = &obj_A1;
如果A1 完全包含




2.多重继承  : VS的内存布局是按照声名顺序排列内存的

猜你喜欢

转载自blog.csdn.net/weixin_38756546/article/details/80881400