C 中的内存对齐

从一个例子开始,下面这段代码,一样的结构体占用的空间大小却不一样。究其原因就是内存对齐。

内存对齐主要是因为

  • 有些机器无法访问任意位置的内存
  • 内存分块存取有利于提升效率
#include <iostream>

 using namespace std;

 struct st1
 {
    char a;
    int  b;
    short c;
};
 struct st2
 {
     short c;
     char  a;
     int   b;
 };

 int main()
 {
     cout << "sizeof(st1) is " << sizeof(st1) << endl;
     cout << "sizeof(st2) is " << sizeof(st2) << endl;
     system("pause");
     return 0;
 }

程序输出 分别为 12 8

内存对齐主要有两条原则

  1. 前面的地址(总和)必须是后面地址的整数倍
  2. 整个 struct 的地址必须是最大字节的整数倍

那么对于 st1 char(1) int(4),所以 char 后需添加 3 Byte,再然后 short(2) ,前面 int(4) 是其整数倍。

整个 st1 10 Byte,不是最大长度 int(4) 整数倍,故添加 3 Byte

对于 st2 第一个 short(2),第二个 char(1) 符合公式1,再然后的 int(4),那么前面必须额外添加 1 Byte 使前面有 4 Byte。

整个 st2 8 Byte 是最大长度 int(4) 的整数倍