运算符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