Series
我不确定为什么该程序的输出是6个字节而不是5个字节。为什么编译器在最后一个成员之后填充一个额外的字节?看起来,如果最后一个成员数组的长度为3,则填充的大小为8。我无法解释这一点,因为这仅适用于2个数组。
答案 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 |
+---+------+
该规则消除了对额外填充字节的需要。