包装和字节对齐,如在C FAQ描述在这里:
这是为了对齐。如果它们以每个方向被塞满,许多处理器就无法访问2字节和4字节的数量(例如,整数和长整数)。
假设你有这个结构:
struct {
char a[3];
short int b;
long int c;
char d[3];
};
现在,您可能认为应该可以将此结构打包到内存中,如下所示:
+-------+-------+-------+-------+
| a | b |
+-------+-------+-------+-------+
| b | c |
+-------+-------+-------+-------+
| c | d |
+-------+-------+-------+-------+
但是如果编译器像这样安排它,它在处理器上要容易得多:
+-------+-------+-------+
| a |
+-------+-------+-------+
| b |
+-------+-------+-------+-------+
| c |
+-------+-------+-------+-------+
| d |
+-------+-------+-------+
在打包版本中,请注意你和我看到b和c字段如何环绕至少有点困难?简而言之,处理器也很难。因此,大多数编译器将填充结构(就好像有额外的,不可见的字段),如下所示:
+-------+-------+-------+-------+
| a | pad1 |
+-------+-------+-------+-------+
| b | pad2 |
+-------+-------+-------+-------+
| c |
+-------+-------+-------+-------+
| d | pad3 |
+-------+-------+-------+-------+