2011-08-19 42 views
4

可能重复:
Why isn't sizeof for a struct equal to the sum of sizeof of each member?为什么struct的sizeof与其成员之和不同?

如果我实现下面的代码,我的sizeof的输出(*拉链)是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的输出(*拉链)是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

哪个编译器和操作系统? –

+0

Microsoft Visual Studio 2005(嵌入在鹰测试系统中) – bamboolouie

回答

3

你可能有一个编译器,一切都对齐到8个字节。

1

允许C实现向结构中添加填充以确保结构的两个成员都针对目标平台进行了最佳对齐,因此当它们的数组形成时,结构本身的实例会对齐。

实现选择的特定对齐可能取决于特定结构的大小以及其成员的类型和布局。

6

一般的答案是,编译器可以自由成员之间添加填充物不管出于什么目的(通常对齐要求)。

具体的答案是,你的编译器可能是对准double成员8字节边界上。在不需要填充的第一个示例中。在第二个示例中,它需要在int c成员之后填充4个字节。

0

如果你想让你的结构更有效地使用#pragma pack(push,1)之前和#pragma pack(pop)之后。如果速度很快,并且可能程度较小,代码大小将会很高。

http://www.cplusplus.com/forum/general/14659/

相关问题