C 为什么结构的大小与其成员的总和不同?
可能重复:C 为什么结构的大小与其成员的总和不同?,c,sizeof,C,Sizeof,可能重复: 如果我实现下面的代码,我的sizeof(*zip)输出是56。 [10+10+4+4*8]字节=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)输出是56。 [10+10+4+4*8]字节=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}
};
您可能有一个将所有内容都对齐到8字节的编译器。允许C实现向结构添加填充,以确保结构的两个成员针对目标平台进行最佳对齐,从而在形成结构实例数组时对齐结构实例本身
实现选择的特定对齐方式可能取决于特定结构的大小及其成员的类型和布局。一般的答案是编译器可以出于任何目的(通常是对齐要求)在成员之间自由添加填充
具体的答案是,编译器可能正在将
double
成员对齐在8字节的边界上。在第一个示例中,不需要填充。在第二个示例中,在int c
成员之后需要4个字节的填充。如果要使结构更高效地使用内存,请在其前面使用#pragma pack(push,1),然后使用#pragma pack(pop)。这将是昂贵的,如果速度,可能在较小程度上,代码大小
请参见Microsoft Visual Studio 2005(嵌入到eagle测试系统中)