1、结构体大小的计算
- 当为空结构体时,其大小为1
- 选取结构体中类型字节数最大的最为对齐符。注意:是最大的类型字节数,例如:int a[10],并不是以40作为对齐符
- 每次申请对齐符个字节大小的内存。
- 当内存不够时才继续申请。
举例:
struct A
{
int a[10];
char b;
double c;
}
//该结构体中最大的类型是double,所以对齐符为8
1、首先分配8个字节
2、int a[10]占40个字节
3、所以每两个数组元素申请8个字节
4、直到申请5次(40个字节)才将int a[10]全部分配完毕
5、再为b分配8个字节(此时已经48个字节了)
6、最后为c分配,此时为b申请的8个字节还剩7个字节,并不够用,还得再分配8个字节。
7、总共56个字节
2、类大小的计算
- 首先,类的大小也最遵循结构体大小的对齐原则
- 类的大小与普通数据成员有关,与成员函数和静态成员无关。即普通成员函数、静态成员函数、静态数据成员、静态常量数据成员均对类的大小无影响
- 虚函数对类的大小有影响,是因为虚函数表指针带来的影响
- 虚继承对类的大小有影响,是因为虚基表指针带来的影响
- 空类的大小是一个特殊的情况,空类的大小为1
注意1:静态成员不计入类大小
class B
{
public:
int a;
char b;
static int c;
};
//该类的大小为8,c不计入类的大小
注意2:空类大小为1
class B
{
public:
};
//空类,大小为1
注意3:派生类继承空类时,其大小为自身类大小,并不加上父类的1
class B
{
public:
};
class C : public B
{
public:
int a;
};
//C的大小为4,并不是5
注意4:类中用空类,要将空类按一个字节算
class B
{
public:
};
class C
{
public:
int a;
B b;
};
//此时C的大小为8,C中的成员b按一个字节算,按照对其原则,C占8个字节
注意:5带虚函数的类的大小,要将虚函数指针算进去
class A
{
public:
virtual int fun(){};
int a;
};
class B : public A
{
public:
int b;
};
//A大小为8,B大小为12