实际报告的sizeof结构小于4 B.

时间:2014-09-22 09:03:54

标签: c struct padding sizeof

我试图理解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

为什么填充不适用于上述两种结构?

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