可能重复:
Why isn't sizeof for a struct equal to the sum of sizeof of each member?
如果我实现下面的代码,我的sizeof(* zip)输出为56。 [10 + 10 + 4 + 4 * 8] byte = 56
typedef struct{
char a[10];
char b[10];
int c;
double d,f,g,h;
}abc_test;
abc_test zip[] =
{
{"Name" ,"Gender", 0,100,200,300,400},
{"Name" ,"Gender", 0,100,200,300,400}
};
但是当我实现下面的代码时,我的sizeof(* zip)输出为440。 [100 + 100 + 100 + 100 + 4 + 4 * 8] = 436,我的问题是另外4个?
typedef struct{
char a[100];
char b[100];
char i[100];
char j[100];
int c;
double d,f,g,h;
}abc_test;
abc_test zip[] =
{
{"Name" ,"Gender","age","mode", 0,100,200,300,400},
{"Name" ,"Gender","age","mode", 0,100,200,300,400}
};
答案 0 :(得分:6)
一般的答案是,无论出于何种目的,编译器都可以在成员之间自由添加填充(通常是对齐要求)。
具体答案是您的编译器可能正在将double
成员对齐在8字节边界上。在第一个不需要填充的示例中。在第二个示例中,它需要在int c
成员之后填充4个字节。
答案 1 :(得分:3)
您可能有一个编译器将所有内容对齐到8个字节。
答案 2 :(得分:1)
允许AC实现向结构添加填充,以确保结构的两个成员都针对目标平台进行了最佳对齐,因此结构本身的实例在形成它们的数组时就会对齐。
实现选择的特定对齐方式可能取决于特定结构的大小以及其成员的类型和布局。
答案 3 :(得分:0)
如果你想让你的结构更高效,请在它之前使用#pragma pack(push,1),之后使用#pragma pack(pop)。这将是昂贵的速度,并且可能在较小程度上是代码大小。