定义一个简单的结构体
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)
内存字节对齐规则:
-
对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的偏移量必须是
min
【#pragma pack()指定的数】,这个数据成员的自身长度) 的倍数。 -
在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照
#pragma pack
指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。