注意事项:
- 类中构造函数与析构函数不占内存,切记
- 类的大小只与3个因素有关:
- 成员变量(非static数据成员变量)和
- 虚函数指针有关
- 必须考虑到对齐.
例题:
- 题目:32位机器上,有三个类A B C定义如下, 请确定sizeof(A) sizeof(B) sizeof(C)的大小顺序
struct A{
A() {}
~A() {}
int m1;
int m2;
};
struct B:A{
B() {}
~B() {}
int m1;
char m2;
static char m3;
};
struct C{
C() {}
virtual~C() {}
int m1;
short m2;
};
解析:
A. 首先结构体A的大小为8,很容易求出;
B. 结构体B继承A,则B的起始存储大小从第8哥字节开始,(cout<<offsetof(B,m1)<<endl;)
static对结构体本身大小没有影响,另外根据结构体的规则可知,其大小为最大对齐数(4)的倍数。(本来算得14)所以为16;
C. 结构体C中有个虚函数,所以包含虚函数指针,占4个字节,(本来算得大小为10,其大小为最大对齐数(4)的倍数),所以其大小为12.ps:
-
- static数据成员是在静态存储区
-
- 指针空间大小的讨论需要限定在32位机上(32位上为4字节,64位上为8字节)