sizeof+结构体

运算符sizeof可以计算出给定类型的大小,对于32位系统来说,sizeof(char) = 1; sizeof(int) = 4;sizeof(double) = 8;。基本数据类型的大小很好计算,我们来看一下如何计算构造数据类型的大小。

结构体中的成员可以是不同的数据类型,成员按照定义时的顺序依次存储在连续的内存空间。和数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。  

先介绍一个相关的概念—偏移量。偏移量指的是结构体变量中成员的地址和结构体变量地址的差。结构体大小等于最后一个成员的偏移量加上最后一个成员的大小。显然,结构体变量中第一个成员的地址就是结构体变量的首地址。因此,第一个成员i的偏移量为0。第二个成员c的偏移量是第一个成员的偏移量加上第一个成员的大小(0+4),其值为4;第三个成员j的偏移量是第二个成员的偏移量加上第二个成员的大小(4+1),其值为5。

然而,在实际中,存储变量时地址要求对齐,编译器在编译程序时会遵循两条原则;

(1)结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)

(2)结构体大小必须是所有成员大小的整数倍,也即所有成员大小的公倍数。

设定一个结构体Y,第一个数据类型为Y[0],第二个数据类型为Y[1]...依次类推。具体的计算结构体的sizeof的算法如下:

Size_it  max_Y=0 ,sum=0,count=0;

max_Y=Max(sizeof(Y[N]));/***求结构体中最大sizeof的数据类型***/

for(int i=0;i<N;++i)

{

If(i!=N-1)

{

  If (max_Y !=sizeof(Y[i]))

{

sum=sizeof(Y[i])+sizeof(Y[i+1]);

If(sum>=max_Y)

{

count=count+8;

sum=0;

}

else if( sum>4)

{

count=count+8;

sum=0;

}

}

else

{

count=count+8;

}

}

else

{

 count=count+8;

}

}

(1)

结构体: 4 1 8 根据算法可得8+8=16

(2)

结构体: 4 8 根据算法可得8+8=16

(3)

结构体: 1 4 8 根据算法可得8+8=16

(4)

结构体: 8 1 4 根据算法可得8+8=16

(5)

结构体: 8 1 1 1 4 根据算法可得8+8=16

(6)

结构体: 8 1 1  4 1 根据算法可得8+8+8=24

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值