b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

sizeof(1)的分析-查找结构的大小

电脑杂谈  发布时间:2020-05-01 08:25:10  来源:网络整理

结构体的sizeof_大小结构_sizeof计算结构体大小

运算符sizeof可以计算给定类型的大小. 对于32位系统,sizeof(char)= 1; sizeof(int)=4. 基本数据类型的大小易于计算,让我们看一下如何计算构造数据类型的大小.

使用C语言可以构造三种类型的数据: 数组,结构和公用.

数组是相同类型元素的集合. 只要计算单个元素的大小,整个数组所占用的空间就等于基本元素的大小乘以元素数.

结构中的成员可以是不同的数据类型,并且成员按照定义的顺序存储在连续的存储空间中. 与数组不同,结构的大小并不是简单地将所有成员的大小相加. 存储结构变量时,需要考虑系统的地址对齐. 看一下这样的结构:

struct stu1
{
     int i;
     char c;
     int j;
};

使用sizeof查找结构的大小并找到值为12. int占用4个字节,char占用1个字节,结果应该是9个字节,为什么?

大小结构_sizeof计算结构体大小_结构体的sizeof

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

但是,实际上,存储变量时需要对齐地址,并且编译器在编译程序时将遵循两个原则:

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

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

在上面的示例中,前两个成员的偏移量满足要求,但第三个成员的偏移量为5,这不是其自身大小(int)的整数倍. 处理时,编译器将在第二个成员之后添加3个空字节,以使第三个成员的偏移量变为8. 该结构的大小等于最后一个成员的偏移量加上其大小. 上例计算得出的大小为12,符合要求.

再看一个例子:

结构体的sizeof_大小结构_sizeof计算结构体大小

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计算结构体大小_结构体的sizeof_大小结构

对于嵌套结构,您需要对其进行扩展. 当对结构进行大小调整时sizeof计算结构体大小,以上两个原则变为:

(1)扩展结构的第一个成员的偏移量应为扩展结构中最大成员的整数倍.

(2)结构的大小必须是所有成员大小的整数倍. 在这里,所有成员都将计算扩展成员,而不是将嵌套结构视为一个整体.

看下面的例子:

struct stu5
{
      short i;
      struct 
      {
           char c;
           int j;
      } ss; 
      int k;
}

结构stu5的成员ss.c的偏移量应为4,而不是2. 整个结构的大小应为16.

大小结构_sizeof计算结构体大小_结构体的sizeof

以下代码测试原理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

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...