结构体的大小

Posted on 2017-09-05 16:22  杨心漂  阅读(279)  评论(0编辑  收藏  举报

      结构体是我们再熟悉不过的一种结构,是由一系列具有相同类型或不同类型的数据构成的数据集合。但它的大小并不是简单的将所有的成员大小相加哦。接下来我们讨论一下结构体的大小将如何计算。

     首先需要明确一个相关的概念————偏移量。偏移量指的是结构体变量中成员的地址和结构体变量地址的差。

      结构体大小等于最后一个成员的偏移量加上最后一个成员的大小。

     用以下的例子说明:

     struct one

    {

     int a;

    char  b;

    int c;

   };

结构体中第一个成员的地址就是结构体变量的首地址。因此,a的偏移量为0。b的偏移量是第一个成员的偏移量加上第一个成员的大小0+4=4;cj的偏移量是第二个成员的偏移量加上第二个成员的大小 4+1=5。

 

 存储变量时要求地址对齐 ,编译器在编译程序时会遵循以下原则:

一、结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)
二、结构体大小必须是所有成员大小的整数倍。
 
第三个成员的偏移量为5,并不是自身(int)大小的整数倍。编译器在处理时会在第二个成员后面补上3个空字节,使得第三个成员的偏移量变成8。
 
上面的例子中计算出来的大小为12
所以不同的定义顺序会影响到结构体的大小,故在定义结构体时要考虑到字节对齐。