先看一个例子:
struct my_t
{
int type;
char x;
char y;
};
struct my_t1
{
char x;
int type;
char y;
};
struct my_t2
{
char x;
char y;
int type;
};
int _tmain(int argc, _TCHAR* argv[])
{
my_t a;
my_t1 b;
my_t2 c;
printf_s("%d\n%d\n%d\n",&a.x,&a.y,&a.type);
printf("\n");
printf_s("%d\n%d\n%d\n",&b.x,&b.y,&b.type);
printf("\n");
printf_s("%d\n%d\n%d\n",&c.x,&c.y,&c.type);
printf_s("%d\n%d\n%d\n",sizeof(a),sizeof(b),sizeof(c));
return 0;
}
结果为:
1245020
1245021
1245016
1244996
1245004
1245000
1244980
1244981
1244984
8
12
8
3个结构体中的成员变量相同,只是因为定义的顺序不同则结构的存储空间就有区别。
这是由于变量对于存储边界要求非常严格,起始地址必须被4整除。
对于my_t1结构,char型变量只占一个字节,而要存储int型变量时,必须在char型变量后填充三个单元使得int型变量的起始地址能被4整除。再存储下一个char型也必须补充足4个内存单元。
而对于my_t与my_t2结构类似,两个char型变量挨在一起,则在存储完两个char型变量后只需再填充两个内存单元便可使得凑足4个内存单元,再加上int型变量的4个字节总共8个字节。