1 为什么要内存对齐

现在的操作系统一般都是32位或者64位,一次性内存访问可以读取4个字节或者8个字节。

比如我们使用64位操作系统,地址从0开始,我们把8字节double放到了0x4位置。系统读取内存的时候,就需要两次读取再合并数据。先从0x0读取8字节,再从0x08读取8字节。

2 内存对齐规则

  1. 第一个成员在与结构体变量偏移量为0的地址处。

  2. 其他变量要对齐到某个数字(对齐数)的整数倍的地址处(一般对齐数都等于成员本身占用内存字节数)

  3. 结构体总大小为最大对齐数(每个成员变量都有对齐数)的整数倍

3 举例

示例程序目录/assets/CProgrammingLanguage/02_MemoryAlignment/

/* sizeof (struct S1) = 12 */
struct S1{
	char c1; /* 0 */
	int n; /* 4 */
	char c2; /* 8 */
};

/* sizeof (struct S2) = 8 */
struct S2{
	int n; /* 0 */
	char c1; /* 4 */
	char c2; /* 5 */
};

结构体S1中,第二个成员int n的对齐数是4,第一个成员占用了一个字节,4的最小整数倍是4,所以第二个成员只能放在0x4位置。该结构体的最大对齐数是4,第三个成员放到了0x08位置,一共占用了9个字节,为了内存对齐,所以3 * 4 = 12