成员后struct padding额外字节

时间:2018-08-23 22:51:37

标签: c

Series

我不确定为什么该程序的输出是6个字节而不是5个字节。为什么编译器在最后一个成员之后填充一个额外的字节?看起来,如果最后一个成员数组的长度为3,则填充的大小为8。我无法解释这一点,因为这仅适用于2个数组。

1 个答案:

答案 0 :(得分:0)

以下是编译器生成的对齐方式的说明:
字节:

+-----+---------------+  
|  0  | a[1]          |  
+-----+---------------+  
|  1  | N/A (padding) |  
+-----+---------------+  
|  2  | b             |  
+-----+---------------+  
|  3  | b             |  
+-----+---------------+  
|  4  |    c          |  
+-----+---------------+  

为16位数量:

+---+------+----+  
| 0 | a[i] |    |  
+---+------+----+  
| 2 | b         |
+---+------+----+  
| 4 |   c  |    |
+---+------+----+  

处理器喜欢从偶数地址中获取16位数据。
当它们位于奇数地址上时,计算机可能必须进行2次16位提取,并从中提取未对齐的数据。

消除这种额外获取的一种简单方法是添加填充字节,以使16位数量对齐到偶数地址。

经验法则是先放置较大的物品,然后放置较小的物品。 应用此规则:

+---+------+  
| 0 | b    |  
+---+------+  
| 2 | a[1] |  
+---+------+  
| 3 | c    |  
+---+------+  

该规则消除了对额外填充字节的需要。