结构体对齐问题

来源:互联网 发布:linux 7 配置ip地址 编辑:程序博客网 时间:2024/04/29 22:37

struct data             8字节对齐

 { int cat;    4               

int a[5];     4*5 =20

double dog;  8

} size 32          32刚好是8的倍数

 

 

struct data        8字节对齐

{ int cat;   4

int a[6];   4*6=24

double dog;  8

}size40. 

 

要是说数据对齐 估计你想象不来

你就这么记  真实大小要凑成 几字节对齐 那个几的倍数

例如第二个 真实是 36  而比36大的8的倍数 最近的就是40 

 

结构体大小的确定

结构体大小的确定 (注:在下面的解释中,针对的是含有基本类型的结构体,对于复杂的结构体尚未进行研究,系统为32-bit)昨晚探讨了有关结构体大小的影响因素,最后得到了一个结论:

含有基本类型的结构体的大小所对应的最终决定因素是结构体内自身成员的分布。成员不同的分布将导致含有相同成员结构体大小的不同,每个成员的对齐都是以紧接着后面的一个为参考的,如果紧接着的大于对应指定,就以紧接着的为对齐因子,否则将联系周围的具体情况进行对齐,而且对齐因子只有三种类型:124。对于最后一类孤立的成员,以结构体中最大成员一致。下面将通过实例来验证。

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,分析如下:

var1short int,本来是2个字节,但是后面的int决定了它需要4个字节;

var24个字节

var38个字节

var4,var5总共4个字节

总共20个字节。同样的,可以将var4,var5作为孤立成员来看。

原创粉丝点击