【结构体】关于结构体的地址对齐

结构体作为C语言编程环境下一种重要的变量类型,在实际使用中有着广泛的应用,那么如何声明并使用一个结构体变量我相信读者应该有所了解,笔者也将不再重复。

 

本篇文章,请让我们将重点放在结构体变量的地址对齐上,对齐变量的地址有2个好处:

  1.节省内存资源。

  2.加快运行时的读取效率。

 

在内存中开辟一块空间变量时,是有要求的。

例如:(以32位电脑系统为例)

  char型必须为1的整数倍

  int 型为4的整数倍

  等等

这多少多少整数倍,就是对变量地址宽度的要求,我们定义为M值(如上文中char型的M指为1,int型的M指为4)

但如果变量的尺寸大于系统位数(如:long 型等),将会造成阉割。

也就是说,最终的变量尺寸(以字节为单位)无法超过系统位数÷8。

 

 

在结构体的地址对齐中,以其中占据字节数最大的变量类型为最小整数倍。

以上是地址对齐应该遵守的规则。

 

我们以一个图例作为理解。同样地,以32位系统为例。

(在32位系统中,CPU读取字节以4个字节为单位。)

 

#include <stdio.h>

struct demo{

   char a; //1

   int   b;//4

   long c; //8

   short d; //2

};

int main(void)
{
      struct demo test; //定义一个demo型结构体

       printf("%d\n",sizeof(test));
}

 这样我们可以得到一个结果为:20  = (1+3)+4+(4+4)+(2+2)

这样是我们这个结构体所占的内存大小。

我们现在调整以下这个结构体中的成员顺序:

#include <stdio.h>

struct demo{

   char a; //1

   short d; //2

   int   b;//4

   long c; //8


};

int main(void)
{
      struct demo test; //定义一个demo型结构体

       printf("%d\n",sizeof(test));
}

 这样我们可以得到一个结果为:16 = (1+2 +1)+4+(4+4)

 

成员内容不变,但是调换了顺序以后,所占的内存变小了。

posted @ 2018-04-16 14:04  schips  阅读(715)  评论(0)    收藏  举报