首先,引入两个概念“数据类型大小”和“指定对齐值”:
- 数据类型大小:char 为 1 个字节,short 为 2 个字节,int 为 4 个字节,double为 8 个字节等等;
- 指定对齐值:#pragma pack (value) 所指定的对齐的值,例如 g++ 4.5.2 x86 默认值为 4;
引入一个重要的概念——有效对齐值 N:
有效对齐值 N = min( (1), (2)),即:“数据类型大小”与“指定对齐值”的最小值。
在 C / C++ 语言中,需要同时满足如下A、B两个条件:
- 条件A:结构体(struct)的数据成员的 起始地址 addr_start 需要是有效对齐值 N的整数倍,即 addr_start % N == 0;
- 条件B:结构体(struct)的大小必须是 所有成员变量的最大有效对齐值 max_N 的整数倍,即 sizeof(struct) % max_N == 0。
例如:
struct a {
char a1;
short a2;
short a3;
double a4;
int a5;
char a6;
};
笔者机器的默认指定对齐值为4,分析:
- a1 的有效对齐值为 1,起始地址为 0,占 1 个字节;
- a2 的有效对齐值为 2,由于条件 A,起始地址为 2,a1与a2之间 空 1 个字节,a2占 2 个字节;
- a3 的有效对齐值为 2,由于条件 A,起始地址为 4,没有间隔,a3 占 2 个字节;
- a4 的有效对齐值为 4,由于条件 A,起始地址为 8,没有间隔,a4 占 8 个字节;
- a5 的有效对齐值为 4,由于条件 A,起始地址为 16,没有间隔,a4 占 4 个字节;
- a6 的有效对齐值为 1,由于条件 A,起始地址为 20,没有间隔, a5 占 1 个字节;
- 由于条件 B,最大有效对齐值为 4,总长度为 4 的倍数, 结构体最后补 3 个字节。
所以,上述结构体总共大小为 24 个字节。