结构体为什么需要内部填充?

参考文章:alignment and padding

定义一个简单的结构体

struct {
	char a[3];
	short int b;
	long int c;
	char d[3];
}

理想内存结构

+-------+-------+-------+-------+
|           a           |   b   |
+-------+-------+-------+-------+
|   b   |           c           |
+-------+-------+-------+-------+
|   c   |           d           |
+-------+-------+-------+-------+

基本上,是连续的一段内存,但大多数编译器来讲却不是这样的。

实际内存结构

+-------+-------+-------+
|           a           |
+-------+-------+-------+
|       b       |
+-------+-------+-------+-------+
|               c               |
+-------+-------+-------+-------+
|           d           |
+-------+-------+-------+

这样排列,对于编辑器来讲,容易实现。
对于一些大多数处理器来讲,它们不太可能会识别出2-4字节的数量

解决办法

引入字节对齐方案,就是填充一些看不见的字段,这些字段对我们来说没有多大的用处,但它仍然要占用一定的内存空间。

+-------+-------+-------+-------+
|           a           | pad1  |
+-------+-------+-------+-------+
|       b       |     pad2      |
+-------+-------+-------+-------+
|               c               |
+-------+-------+-------+-------+
|           d           | pad3  |
+-------+-------+-------+-------+

如果不使用字节对齐,可以考虑下面代码:

#param pack(1)

内存字节对齐规则:

  1. 对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的偏移量必须是min【#pragma pack()指定的数】,这个数据成员的自身长度) 的倍数。

  2. 在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。

posted @ 2022-10-21 14:22  辰梦starDream  阅读(2)  评论(0编辑  收藏  举报  来源