概念与原则:
对齐值:
- 基本数据类型的对齐值为其内存大小
- 自定义类型(结构体/类)的对齐值为其类型递归取得的最大基本类型
- 数组的对齐值为其基本类型,并不是整体内存大小
偏移地址:
- 第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员内存大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节, 则要从4的整数倍地址开始存储),基本类型不包括struct/class/uinon。
结构体总内存大小
- 结构体的总大小为结构体的有效对齐值的整数倍
实例:1. 成员变量都是基础数据类型
// 这里的struct替换成class也一样
struct s1 {
char a;
int b;
short c;
};
struct s2 {
int b;
short c;
char a;
};
s1 ss1;
s2 ss2;
cout << sizeof(ss1) << endl; // 12
cout << sizeof(ss2) << endl; // 8
实例2:成员变量中有数组
// 1
class BigData
{
char array[33];
};
class Data
{
BigData bd;
int integer;
double d;
};
BigData bd;
Data da;
cout << sizeof(bd) << endl; // 33
cout << sizeof(da) << endl; // 48
// 2
struct aa {
double x;
char c[33];
};
class c {
public:
aa ccc;
int a;
};
c ccc;
aa sfa;
cout << sizeof(sfa) << endl; // 48
cout << sizeof(ccc) << endl; // 56
实例3:成员变量中有自定义类型
class s11 {
char a;
int b;
short c;
};
class s22 {
int b;
short c;
s11 ssss;
char a;
};
cout << sizeof(s11) << endl; // 12
cout << sizeof(s22) << endl; // 24