Struct结构体中的内存对齐

前言

最近找实习做了不少企业的笔试题,发现很多都考了结构体的占用空间大小的问题,鉴于自己也有点遗忘,于是就找了些资料复习了一下,自己也实验了一下,于是简单写一篇blog分享一下

理论

背书式:各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数 各成员变量在存放的时候根据在结构中出现的顺序依次申请空间 同时按照上面的对齐方式调整位置 空缺的字节自动填充 同时为了确保结构的大小为结构的字节边界数(即该结构中占用最大的空间的类型的字节数)的倍数,所以在为最后一个成员变量申请空间后 还会根据需要自动填充空缺的字节
多!
简!
单!

作者:邹zl链接:https://www.zhihu.com/question/27862634/answer/46556769来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

首先在知乎找了个资料,说的还是挺简单又解决了问题,所以搬运一下

整理一下:

  • 各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数
  • 各成员变量在存放的时候根据在结构中出现的顺序依次申请空间
  • 同时按照上面的对齐方式调整位置 空缺的字节自动填充
  • 同时为了确保结构的大小为结构的字节边界数(即该结构中占用最大的空间的类型的字节数)的倍数,所以在为最后一个成员变量申请空间后 还会根据需要自动填充空缺的字节

实验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
using namespace std;

int main() {
// 基本的最后补齐
struct a {
int i;
char c;
};
// b 和 c 为了说明结构体中声明的顺序会影响结构体所占的大小
struct b {
char c;
double f;
int in;

};
struct c {
double f;
char c;
int in;
};
cout << sizeof(struct a) << endl;
cout << sizeof(struct b) << endl;
cout << sizeof(struct c) << endl;
}

这个实验的输出:

1
2
3
8
24
16

那就再可视化一下内存分布吧

(我的触摸笔画的丑了点)