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
内存对齐主要有两条原则
- 前面的地址(总和)必须是后面地址的整数倍
- 整个 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) 的整数倍