(注:在下面的解释中,针对的是含有基本类型的结构体,对于复杂的结构体尚未进行研究,系统为32-bit)昨晚探讨了有关结构体大小的影响因素,最后得到了一个结论:
含有基本类型的结构体的大小所对应的最终决定因素是结构体内自身成员的分布。成员不同的分布将导致含有相同成员结构体大小的不同,每个成员的对齐都是以紧接着后面的一个为参考的,如果紧接着的大于对应指定,就以紧接着的为对齐因子,否则将联系周围的具体情况进行对齐,而且对齐因子只有三种类型:1,2,4。对于最后一类孤立的成员,以结构体中最大成员一致。下面将通过实例来验证。
1、看看下面这个结构体:
struct s1 {
char var1;
int var2;
char var3;
};
根据上面提到的结论,(假设起始地址为0x00000000)&s1.var1=0x00000000,&s1.var2=0x00000004,
&s1.var3 = 0x0000000a.var1对齐在0x00000000,而var2将对齐在0x00000004,因为var1所占用的
空间要以var2为基准,也是占用4个,至于var3,后面没有任何成员,而且这个结构中最大成员为4个字节,
所以var3也是占用4个字节,如此一来,结构体的大小就是12。
再来看看结构体struct s2
struct s2{
int var1;
char var2;
char var3;
};
var1占用4个字节,var2,var3分别占用一个字节,根据前面的结论,最后的成员要以4作为对齐因子,所以var2,var3实际上占用的是4个字节,最后得到的sizeof(struct s2)=8.
再来看看结构体struct s3
struct s3 {
int var1;
char var2;
char var3;
char var4;
char var5;
char var6;
};
通过以上的结论可以推知,var2,var3,var4,var5总共占用4个字节,var6遵循最大因子对齐方式,占用4个字节,由此以来,sizeof(struct s3) = 12.这里可以将var6作为孤立成员来看。
同样的,看看下面的这个结构体struct ss
struct ss {
short int var1;
int var2;
double var3;
char var4;
char var5;
};
sizeof(struct ss) = 20,分析如下:
var1为short int,本来是2个字节,但是后面的int决定了它需要4个字节;
var2为4个字节
var3为8个字节
var4,var5总共4个字节
总共20个字节。同样的,可以将var4,var5作为孤立成员来看。
上面仅仅是笔者的总结,如果不正确的地方望指正。
阅读(5079) | 评论(1) | 转发(0) |