sizeof(struct)不遵循填充

时间:2014-04-09 20:06:26

标签: c struct structure sizeof

考虑,

#include<stdio.h>

struct outside1
{
    int a;
    char b;
    char c;
    char d[3];
};

struct outside2
{
    char a,b,A[2];
    char B[2];
};

int main()
{
    printf("%zu %zu\n",sizeof(struct outside1),sizeof(struct outside2));
    return 0;
}

通过使用填充概念预测输出,它将是&#34; 12 8&#34;。但实际输出是&#34; 12 6&#34;。

使用gcc 4.7.2 Debian

任何人都能解释一下吗?

-Newbie

2 个答案:

答案 0 :(得分:3)

charint几乎在任何实现上都有自己大小的对齐要求。

sizeof(char)每个标准为1,int的常见尺寸为1,2和4。

这导致outside1的共同大小为6,8,12 对于outside2的6。

BTW:允许编译器在每个结构成员之后插入任意数量的填充,尽管它通常使用最小的必要来考虑对齐限制,以便轻松地遵循&#34;共同的初始子序列&#34; - 规则。

此外,由于C99或其附近的路线限制为2的幂,并且物体大小必须由它均匀分割。

答案 1 :(得分:1)

struct outside2
{
    char a,b,A[2];
    char B[2];
};

您希望此结构的大小为8个字节;实际上,它的大小是6个字节(在你的实现上)。

不需要任何额外的填充。任何类型的数组都具有与元素类型相同的对齐要求,这意味着AB只需要字节对齐。

结构中总共有6个char成员或子成员。由于不需要填充,因此总大小为6个字节。

编译器可以在末尾添加另外2个字节的填充。例如,如果它要求所有结构或超过某个大小的所有结构至少具有4字节对齐,则可能会这样做。但是你正在使用的编译器并没有这样做。

具体的对齐和填充要求当然可以因系统而异;它们由每个编译器强制执行,并且可能由平台的ABI定义。