内存对齐原则
- 对于结构体(
struct
)、联合体(union
)首个数据成员放在offset
为0的位置
- 后续数据成员以首成员大小的整数倍位置开始,如果首成员是数组、结构体等具有子成员的结构,则以子成员大小的整数倍位置开始
- 如果是结构体中含有结构体作为成员,则结构体成员要以自身内部的最大元素大小整数倍作为基础。(
structA
中含有structB
,structB
中最大元素为double
,则structB
以8的整数倍存储)
- 结构体(
struct
)的总大小必定是其最大成员大小的整数倍,不足需要补齐
Struct1
计算方式
成员 |
大小 |
补齐字节 |
总大小 |
所在位数 |
a |
1 |
7 |
1 |
1 |
b |
8 |
0 |
8 |
2 |
c |
2 |
0 |
2 |
3 |
d |
4 |
0 |
4 |
3 |
因为b起始位置需要是8的倍数,所以a需要补7位
a = ( 1 + 7 )
计算总和
a + b + c + d
= 8 + 8 + 2 + 4
= 22
最终大小需要是8的倍数,补齐2字节,最终大小24字节
Struct2
计算方式
成员 |
大小 |
补齐字节 |
总大小 |
所在位数 |
a |
4 |
0 |
4 |
1 |
b |
1 |
0 |
1 |
1 |
c |
2 |
1 |
3 |
1 |
d |
8 |
0 |
8 |
2 |
a、b、c 3个成员加起来都不足以到8字节,所以可以放在同1位
a + b + c
= 4 + 1 + 2
= 7
因为d的起始位置需要是8的倍数,所以补齐1字节
( 1 + 7 ) + d = 16
已经是8的倍数不需要补齐,最终大小16
Struct3
计算方式
成员 |
大小 |
补齐字节 |
总大小 |
所在位数 |
a |
3 * 1 |
0 |
3 |
1 |
b |
1 |
0 |
1 |
1 |
c |
2 |
2 |
4 |
1 |
d |
1 |
0 |
8 |
2 |
a、b、c 3个成员加起来都不足以到8字节,所以可以放在同1位
a + b + c
= ( 3 x 1 ) + 1 + 2
= 6
因为d的起始位置需要是8的倍数,所以补齐2字节
( 6 + 2 )+ d = 16
已经是8的倍数不需要补齐,最终大小16
打印结果