参考文档: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;
}