代码分析虚继承类的所占内存大小问题

来源:互联网 发布:淘宝网首页布局介绍 编辑:程序博客网 时间:2024/05/01 06:30


//c++类的虚继承问题,代码有任何问题,请留言相告,不胜感激

//每个对象里都有虚表指针,指向虚表,虚表里存放了虚函数的地址。虚函数表示顺序的存放虚函数的地址的,不需要用到链表                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
#include <iostream>
#include<memory.h>
#include<assert.h>
using namespace std;
class A
{
public:
virtual void aa() {};//A类有一个虚函数,必然有一个对应的虚函数表来记录对应的函数入口地址
                    //每个地址需要一个虚指针,指针的大小为4
private:
char k[3];//每一个char值所占位置为1(但是编译一般以4的倍数做数据对齐),故其所占的字节数为4
};
//综上A类所占的字节数应该为8


/*各位看官继续往下走*/


//由于B继承了A,同时B类还有自己的虚函数,所以首先应当有虚表指针,指向自己的虚函数表
//虚继承的实现,首先加入一个虚类指针指向其父类,然后包含父类的所有内容
//sizeof(B)=char k[3]+j类虚指针+sizeof(A)=4+4+8=16
class B :public virtual A
{
char j[3];//同上,j所占的字节为4
public:
virtual void bb() {};
};
//C类=C类虚指针+char i[3]+sizeof(B)=4+4+16=24
class C :public virtual B
{
char i[3];
public:
virtual void cc() {};
};




int main(int argc,char*argv[])
{
cout << "sizeof(A):" << sizeof(A) << endl;
cout << "sizeof(B):" << sizeof(B) << endl;
cout << "sizeof(C):" << sizeof(C) << endl;

}

gcc 运行结果是:8 16 24 

vs2015运行结果是:



原创粉丝点击