结构填充成员后的额外字节


#include <stdio.h>
#include <stdint.h>
typedef struct s{
uint8_t a[1];
uint16_t b;
uint8_t c[1];
}s_t;
int main()
{
printf("size = %d", sizeof(s_t));
return 0;
}

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

下面是编译器生成的
对齐方式的图示:字节:

+-----+---------------+  
|  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    |  
+---+------+  

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

最新更新