通过例子分析结构体对齐
时间: 2023-10-23 14:09:58 浏览: 108
结构体对齐是指编译器为了保证内存访问的效率和正确性,在结构体内部添加一些空间(即填充位),使得结构体内的所有成员变量按照一定的规则对齐。这个规则一般由编译器的实现者定义,但通常遵循以下原则:
1. 结构体成员变量的起始地址必须是它本身大小的整数倍。
2. 结构体的总大小必须是结构体中最大成员变量大小的整数倍。
下面通过一个例子来详细解释结构体对齐的原理。
假设有以下结构体:
```c
struct _example {
char a;
int b;
short c;
};
```
其中 `char` 类型大小为 1 字节,`int` 类型大小为 4 字节,`short` 类型大小为 2 字节。
根据原则 1,结构体成员变量的起始地址必须是它本身大小的整数倍,所以 `a` 的起始地址是结构体的起始地址,`b` 的起始地址应该是 4 的整数倍(即 `a` 的大小),`c` 的起始地址应该是 8 的整数倍(即 `a` 和 `b` 的大小之和)。
根据原则 2,结构体的总大小必须是结构体中最大成员变量大小的整数倍,所以此结构体的大小应该是 12 字节(即 `int` 类型大小),即使 `char` 和 `short` 类型的大小加起来只有 3 字节。因为编译器为了保证 `b` 能够按照 4 字节对齐,需要在 `a` 和 `c` 之间填充 2 字节的空间。
所以在 32 位机器上,这个结构体的内存布局应该是:
```
+---+---+---+---+---+---+
| a | P | P | P | b | b |
+---+---+---+---+---+---+
| b | b | b | b | c | c |
+---+---+---+---+---+---+
```
其中 `P` 表示填充位。
这样做的好处是,在访问结构体成员变量时,由于每个成员变量的起始地址都是对齐的,所以能够更快地访问内存。而且这种对齐方式在不同的机器上都能够保证结构体的大小和内存布局的一致性。
阅读全文