struct
1、普通情况下 等于最后一个数据大小+最后的偏移量。其中偏移量是结构体中当前数据内存地址到上一个数据内存地址的差,注意两点:
(1)当前偏移量必须是当前数据大小的整数倍
(2)最后结构是所以成员最小公倍数
struct s
{
int a;//本4 偏0
char b;//本1 偏4
double c;//本8 偏8(1+4+3)
short d;//本2 偏16
float e;//本4 偏20(2+16+2)
int f;//本4 偏24
double g;//本8 偏28
//总共40(8+28+4)
};
int main()
{
s s1;
cout << sizeof(s1);
}
2,如果是结构体嵌套的情况下,将结构体展开,注意两点
(1)展开后结构体的第一个成员偏移量是展开结构体最大成员的整数倍
(2)整个结构体大小是所以成员最小公倍数
struct s
{
int a;//本4 偏0
char b;//本1 偏4
double c;//本8 偏8(1+4+3)
struct s2
{
short d;//本2 偏16
float e;//本4 偏20(2+16+2)
char f;//本1 偏24
}s3;
char g;//本1 偏28(1+24+3)
//总共32(1+28+3)
};
int main()
{
s s1;
cout << sizeof(s1);
}
3,含有数组的情况
基本规则相同。数组部分偏移量必须是数组类型的整数倍
struct s
{
int a;//本4 偏0
char b;//本1 偏4
double c;//本8 偏8(1+4+3)
int h[2];//本8,偏16
struct s2
{
short d;//本2 偏24;
double i[3];//本24 偏32
float e;//本4 偏56
char f;//本1 偏60
}s3;
char g;//本1 偏64(1+60+3)
//总共72(1+64+7)
};
int main()
{
s s1;
cout << sizeof(s1);
}
联合体
联合体两点要求
(1)必须能容纳最大成员内存
(2)是成员内存最大类型的整数倍
union s
{
int a;//最大成员类型 4
char b[11];//最大成员内存 12
short c;
};//总=12
int main()
{
s s1;
cout << sizeof(s1);
}
枚举体
因为枚举体存放的就是int类型=4
enum s
{
a = 1,
b = 324237472342,
c=-111111111111111111,
d=10000000000000000000
};
int main()
{
s s1;
cout << sizeof(s1);
}
Class
1,空类=1
2,类的虚函数=4(因为指针指向虚函数表),不管多少都是4
3,类的普通数据成员按结构体对齐
4 类的静态成员不算入内
5 类的普通函数=0
6 普通继承=父类数据成员大小+子类数据成员大小
7 类的虚继承=父类数据成员大小+子类数据成员大小+4