#include <iostream>
using namespace std;
class A{};
class B
{
int b;
char c;
};
class C
{
int c1;
static int c2;
};
int C::c2 = 1;
class D:public C,public B{
int d;
};
int main()
{
cout<<"sizeof(A)="<<sizeof(A)<<endl;
cout<<"sizeof(B)="<<sizeof(B)<<endl;
cout<<"sizeof(C)="<<sizeof(C)<<endl;
cout<<"sizeof(D)="<<sizeof(D)<<endl;
return 0;
}
using namespace std;
class A{};
class B
{
int b;
char c;
};
class C
{
int c1;
static int c2;
};
int C::c2 = 1;
class D:public C,public B{
int d;
};
int main()
{
cout<<"sizeof(A)="<<sizeof(A)<<endl;
cout<<"sizeof(B)="<<sizeof(B)<<endl;
cout<<"sizeof(C)="<<sizeof(C)<<endl;
cout<<"sizeof(D)="<<sizeof(D)<<endl;
return 0;
}
分析:
运行结果为:
sizeof(A)=1
sizeof(B)=8
sizeof(C)=4
sizeof(D)=16
对于类A来说,虽然A是一个空类,但为了便于空类进行实例化,编译器往往会给它分配一个字节,这样A实例化后便在内存中有了一个独一无二的地址.对于类B,B的大小应为sizeof(int)+sizeof(char)=5,但是考虑内存对齐,32位是4字节对齐,B的大小应为8.对于类C,类的静态成员变量被放在全局区,和类的普通成员并没有放在一块。类的静态成员被声明后就已存在,而非静态成员只有类被实例化后才存在。所以C的大小为sizeof(int)=4。D的大小为B+C的大小+自身数据成员的大小,一共为16.
下边考虑有虚函数
不管类中有一个或者多个虚函数 类的大小只增加4字节
类的大小 不考虑成员函数和构造函数和析构函数的大小
类中含有不同成员变量时类的大小
三个规则:
【1】结构体变量的首地址能够被这个变量大小所整除 【2】结构体每个成员相对于结构体首地址的偏移量是成员大小的整数背 【3】结构体的总大小为结构体最宽基本类型成员大小的整数背
class A
{
int a;short b,char c;
}//大小为4+2+1,由于第三条规则 股为8,4的整数倍
class B
{
short a;int b;char c;
}//a的大小为2B,所以b的偏移量应该从4开始不应该从2开始,2+4+1,故为12
class B
{
char a;short b;int c;
}//a大小为1,b的大小为2,偏移量要是2的倍数,b的偏移量为2,不应该为1,故2+2+4
class C
{
char b;
short a[10];
int c;
}/2+20+4 故为28,4的倍数