- 内存对齐分析与
struct SubStruct2
大小计算:
struct SubStruct1
:
char c1
:占1字节。
int i1
:通常int
占4字节,由于对齐要求(假设以4字节对齐,一般系统int
的对齐模数为4),c1
后面需填充3字节,i1
从4字节边界开始存储,占4字节。
char c2
:占1字节。
struct SubStruct1
大小为:1 + 3 + 4 + 1 = 8
字节(总大小需是最大成员对齐模数的整数倍,这里最大成员int
对齐模数为4,8是4的整数倍)。
struct SubStruct2
:
short s1
:占2字节。
struct SubStruct1 sub1
:占8字节。
long l1
:假设long
占8字节(在64位系统常见),s1
和sub1
的总大小为2 + 8 = 10
字节,需填充6字节,l1
从16字节边界开始存储,占8字节。
struct SubStruct2
大小为:2 + 8 + 6 + 8 = 24
字节(总大小需是最大成员对齐模数的整数倍,这里最大成员long
对齐模数为8,24是8的整数倍)。
- 优化内存布局:
- 优化思路:将成员按照其大小从小到大排列,尽量减少填充字节。
- 优化后的结构体定义:
struct SubStruct1 {
char c1;
char c2;
int i1;
};
struct SubStruct2 {
short s1;
long l1;
struct SubStruct1 sub1;
};
- 重新计算大小:
struct SubStruct1
:
char c1
:占1字节。
char c2
:占1字节,无需填充。
int i1
:占4字节,c1
和c2
共2字节,需填充2字节,i1
从4字节边界开始存储,占4字节。
struct SubStruct1
大小为:1 + 1 + 2 + 4 = 8
字节(总大小需是最大成员对齐模数的整数倍,这里最大成员int
对齐模数为4,8是4的整数倍)。
struct SubStruct2
:
short s1
:占2字节。
long l1
:占8字节,s1
需填充6字节,l1
从8字节边界开始存储,占8字节。
struct SubStruct1 sub1
:占8字节,无需填充。
struct SubStruct2
大小为:2 + 6 + 8 + 8 = 24
字节(总大小需是最大成员对齐模数的整数倍,这里最大成员long
对齐模数为8,24是8的整数倍)。
在这种情况下,虽然成员顺序调整,但由于long
的对齐要求,整体大小未变。若系统中long
占4字节:
- 优化后的结构体定义:
struct SubStruct1 {
char c1;
char c2;
int i1;
};
struct SubStruct2 {
short s1;
struct SubStruct1 sub1;
long l1;
};
- 重新计算大小:
struct SubStruct1
:同上述分析,大小为8字节。
struct SubStruct2
:
short s1
:占2字节。
struct SubStruct1 sub1
:占8字节。
long l1
:占4字节,s1
和sub1
总大小为2 + 8 = 10
字节,需填充2字节,l1
从12字节边界开始存储,占4字节。
struct SubStruct2
大小为:2 + 8 + 2 + 4 = 16
字节(总大小需是最大成员对齐模数的整数倍,这里最大成员int
和long
对齐模数为4,16是4的整数倍)。