我试图理解struct padding。 以下结构填充:
struct s {
int j;
char c;
int i;
};
==> sizeof(struct s)= 12
但对于这个结构,它不是填充。为什么呢?
struct s {
char c;
}
==> sizeof(struct s)= 1 OR
struct s {
short int i;
}
==> sizeof(struct s)= 2
为什么填充不适用于上述两种结构?
答案 0 :(得分:1)
填充是为了保持struct
的成员对齐,以便快速访问。(*)考虑结构数组中发生的事情:
struct s {
int i;
char c;
};
struct s a[0];
如果未填充此结构,a[1]
将具有地址(char *)a + 5
。这是未对齐的,假设a[0]
已对齐。因此,结构通常将填充为sizeof(int)
的倍数。 (是i
一个long long
,然后整个结构将被填充为sizeof(long long)
的倍数;请尝试查看。)
使用单个char
,无需填充,因为char
无论如何都会对齐,而没有其他成员变得不对齐。使用单个short
时,对齐为2就足以使单个成员始终保持对齐。
(*)在某些CPU上,但不兼容与Intel x86兼容的CPU,未对齐的访问实际上可能会导致程序崩溃。
答案 1 :(得分:0)
添加了填充以确保int
成员i
已对齐。
假设您的int
大小为4个字节,那么它将被放置在4字节边界上以对齐它。这意味着在char
之后有3个字节的填充。因此,12的大小是非常合理的。
想象一下,如果没有填充。然后补偿将是:
Member Offset j 0 c 4 i 5
如果结构以这种方式布局,则i
将被错误对齐。要将它放在4字节边界上,它需要在偏移量8处。因此填充3个字节,总大小为12.因此,实际布局为:
Member Offset j 0 c 4 <padding> 5 i 8