
运算符sizeof可以计算给定类型的大小. 对于32位系统,sizeof(char)= 1; sizeof(int)=4. 基本数据类型的大小易于计算,让我们看一下如何计算构造数据类型的大小.
使用C语言可以构造三种类型的数据: 数组,结构和公用.
数组是相同类型元素的集合. 只要计算单个元素的大小,整个数组所占用的空间就等于基本元素的大小乘以元素数.
结构中的成员可以是不同的数据类型,并且成员按照定义的顺序存储在连续的存储空间中. 与数组不同,结构的大小并不是简单地将所有成员的大小相加. 存储结构变量时,需要考虑系统的地址对齐. 看一下这样的结构:
struct stu1
{
int i;
char c;
int j;
};
使用sizeof查找结构的大小并找到值为12. int占用4个字节,char占用1个字节,结果应该是9个字节,为什么?

首先介绍一个相关的概念偏移. 偏移量是指结构变量中成员的地址与结构变量地址之间的差. 结构的大小等于最后一个成员的偏移量加上最后一个成员的大小. 显然,结构变量的第一个成员的地址是结构变量的第一个地址. 因此,第一成员i的偏移量为0. 第二成员c的偏移量为第一成员的偏移量加上第一成员的大小(0 + 4),其值为4;第三个成员的偏移量j是第二个成员的偏移量加上第二个成员的大小(4 + 1),该值为5.
但是,实际上,存储变量时需要对齐地址,并且编译器在编译程序时将遵循两个原则:
(1)结构变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数字的整数倍)
(2)结构的大小必须是所有成员大小的整数倍,即所有成员大小的公倍数.
在上面的示例中,前两个成员的偏移量满足要求,但第三个成员的偏移量为5,这不是其自身大小(int)的整数倍. 处理时,编译器将在第二个成员之后添加3个空字节,以使第三个成员的偏移量变为8. 该结构的大小等于最后一个成员的偏移量加上其大小. 上例计算得出的大小为12,符合要求.
再看一个例子:

struct stu2
{
int k;
short t;
};
成员k的偏移量为0;成员t的偏移量为4,无需调整. 但是计算得出的大小为6,这显然不是成员k大小的整数倍. 因此sizeof计算结构体大小,编译器将在成员t之后添加2个字节,以使结构的大小变为8,以满足第二个要求.
可以看出,结构类型需要考虑字节对齐. 不同的顺序会影响结构的大小.
比较以下两个定义序列:
struct stu3
{
char c1;
int i;
char c2;
}
struct stu4
{
char c1;
char c2;
int i;
}
尽管stu3和stu4的成员相同,但是sizeof(结构stu3)的值为12,sizeof(结构stu4)的值为8.

对于嵌套结构,您需要对其进行扩展. 当对结构进行大小调整时sizeof计算结构体大小,以上两个原则变为:
(1)扩展结构的第一个成员的偏移量应为扩展结构中最大成员的整数倍.
(2)结构的大小必须是所有成员大小的整数倍. 在这里,所有成员都将计算扩展成员,而不是将嵌套结构视为一个整体.
看下面的例子:
struct stu5
{
short i;
struct
{
char c;
int j;
} ss;
int k;
}
结构stu5的成员ss.c的偏移量应为4,而不是2. 整个结构的大小应为16.

以下代码测试原理2:
struct stu5
{
char i;
struct
{
char c;
int j;
} ss;
char a;
char b;
char d;
char e;
char f;
}
仅结构ss计算出的占用空间为8,而stu5的大小为20,而不是8的整数倍. 这意味着在计算sizeof(stu5)时,嵌套结构ss被扩展了,因此最大成员是ss.j,占4个字节,20是4的整数倍. 如果将ss视为一个整体,结果应为24.
另一个特别的例子是该结构包含一个数组. sizeof应该与嵌套结构的大小相同. 展开它,如以下示例所示:
struct ss
{
float f;
char p;
int adf[3];
};
cout<<sizeof(ss)<<endl;
值为20. float占用4个字节,当char p时偏移量为4,而p占用一个字节,而int adf [3]时偏移量为5,扩展为int的整数倍,而不是int adf [3]整数倍,因此偏移量变为8而不是12. 结果是8 + 12 = 20,这是最大成员float或int大小的整数倍.
由编译器决定如何为结构变量分配空间. 以上情况是指Linux下的GCC. Windows下的VC平台也是如此,其他平台可能会有不同的处理方式.
-结局
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-195067-1.html
但目前服役的可能达不到这个数字
再于是
fightordie