考虑,
#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
答案 0 :(得分:3)
char
和int
几乎在任何实现上都有自己大小的对齐要求。
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个字节(在你的实现上)。
不需要任何额外的填充。任何类型的数组都具有与元素类型相同的对齐要求,这意味着A
和B
只需要字节对齐。
结构中总共有6个char
成员或子成员。由于不需要填充,因此总大小为6个字节。
编译器可以在末尾添加另外2个字节的填充。例如,如果它要求所有结构或超过某个大小的所有结构至少具有4字节对齐,则可能会这样做。但是你正在使用的编译器并没有这样做。
具体的对齐和填充要求当然可以因系统而异;它们由每个编译器强制执行,并且可能由平台的ABI定义。