内存对齐遵循的原则
- 内存分配按照结构体中声明的顺序来分配
- 整个结构体内存对齐的时候, 是以结构体中占用字节最大的那个数据类型的长度对齐的.
举例详解
struct {
short a;
int c;
} test1;
struct {
short a;
short b;
int c;
} test2;
struct {
short a;
short b;
int c;
short d;
} test3;
int main()
{
cout << sizeof(test1) << endl; // 8
cout << sizeof(test2) << endl; // 8
cout << sizeof(test3) << endl; // 12
return 0;
}
看上去很难理解为什么, 但是把图画出来, 就非常容易理解了
test1:
test2:
test3:
这样画图, 是不是就非常容易理解了.
- test1: 按照顺序分配内存, 所以首先给short分配两个字节, 然后int后续占用4个字节, 一共6个字节, 但是最终对齐的时候, 是要按照test1中最大的数据类型长度对齐的, 也就是int的长度: 四个字节, 虽然short只占两个字节, 但是要对其, 所以补位了两个字节
- test2: 和test1一样, 只不过补位的字节, 用short给占用了
- test3: 在test2的基础上, 最后多了一个short, 所以新占用一行4个字节, 虽然只占用2个字节, 但是为了对齐, 还是会补位2个字节
整点有难度的拓展
struct嵌套union
对union共享内存不了解的, 看下这个, 其实就是内存对齐后, 选择最大的那个变量的内存
union内存分配详解
struct
{
int n1;
union u
{
char c[17];
int n2;
}u1;
int n3;
double d1;
}test1;
int main()
{
cout << sizeof(test1) << endl; // 40
return 0;
}
内存分布图如下