您的位置:首页 > 其它

虚继承类内存大小计算

2016-04-29 21:48 411 查看
参考文档:http://blog.csdn.net/hackbuteer1/article/details/7883531

计算公式基于64-bit os,指针大小为8

问题一:含有虚函数类继承的类大小计算

#include<iostream>
using namespace std;
class A
{};
class B
{
char ch;
virtual void func0(){}
};
class C
{
char ch1;
char ch2;
virtual void func(){}
virtual void func1(){}
};
class D:public A,public C
{
int d;
virtual void func(){}
virtual void func1(){}
};
class E:public B,public C
{
int e;
virtual void func0(){}
virtual void func1(){}
};
int main()
{
cout<<"A="<<sizeof(A)<<endl;            //  空类大小为1
cout<<"B="<<sizeof(B)<<endl;           //   虚函数占用一个虚函数类表指针位置 大小为8   数据对齐    输出16
cout<<"C="<<sizeof(C)<<endl;           //   两个虚函数占用一个虚函数类表指针位置 大小为8   数据对齐    输出16
cout<<"D="<<sizeof(D)<<endl;           //   两个基类占用一个虚函数类表指针位置 大小为8  int占内存4 数据对齐    输出16
cout<<"E="<<sizeof(E)<<endl;            //   两个基类占用两个虚函数类表指针位置 大小为16  int占内存4 char 2 数据对齐    输出24
return 0;
}


问题二:含有虚基类和虚函数的计算

#include<iostream>
using namespace std;
class A
{
int a;
};
class B: virtual public A
{
private:
int b;
public:
virtual void func1(){}
virtual void func2(){}
};
class C:virtual public A
{
private:
int b2;
public:
virtual void func3(){}
virtual void func4(){}
};
class D:public B,public C
{
private:
int d;
public:
virtual void func1(){}
virtual void func3(){}
};
int main()
{
cout<<"A="<<sizeof(A)<<endl;            //   大小为int大小4
cout<<"B="<<sizeof(B)<<endl;           //   虚函数占用一个虚函数类表指针位置 大小为8   两个int 8    输出16
cout<<"C="<<sizeof(C)<<endl;           //   虚函数占用一个虚函数类表指针位置 大小为8   两个int 8    输出16
cout<<"D="<<sizeof(D)<<endl;           //   两个基类占用两个虚函数类表指针位置 大小为16 一个虚基类表 大小为8  int占内存16 数据对齐    输出40
return 0;
}


问题三:单虚继承

#include<iostream>
using namespace std;
class A
{
public:
virtual void func1(){}
virtual void func2(){}
private:
char ch[3];

};
class B: virtual public A
{
public:
virtual void func3(){}
virtual void func4(){}
};
int main()
{
cout<<"A="<<sizeof(A)<<endl;            //   大小为int大小4
cout<<"B="<<sizeof(B)<<endl;           //   单继承有一个虚函数类表指针位置 大小为8  三个char 3     输出16
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: