📜  4字节对齐的c代码——C编程语言(1)

📅  最后修改于: 2023-12-03 14:38:52.881000             🧑  作者: Mango

4字节对齐的C代码

在C语言中,结构体的成员变量会按照它们在定义中声明的顺序依次存放。但是在存储时C语言会对其进行对齐(也称为填空),以保证访问内存时的效率和正确性。其中,对齐方式是由编译器控制的。

对于大多数机器,至少4字节对齐是最优的,这也是C的默认对齐方式。4字节对齐是指数据在存储时会被放在内存地址可以被4整除的位置上,其原因是大多数机器的内存访问都是基于4字节的,故按照4字节对齐的方式进行存储,就可以保证内存的访问效率。

以下代码就是一个正确的4字节对齐的结构体定义:

typedef struct _person {
   char name[20];
   int age;
   char gender;
   float height;
} Person;

在上述结构体中,成员变量name的长度为20字节,age的长度为4字节,gender的长度为1字节,height的长度为4字节。所以,按照4字节对齐进行排列时,其应该如下所示:

 offset  variable
   0      name[0]
   1      name[1]
   2      name[2]
   3      name[3]
   4      name[4]
   5      name[5]
   6      name[6]
   7      name[7]
   8      name[8]
   9      name[9]
  10      name[10]
  11      name[11]
  12      name[12]
  13      name[13]
  14      name[14]
  15      name[15]
  16      name[16]
  17      name[17]
  18      name[18]
  19      name[19]
  20      age       
  24      gender    
  28      height    

可以看到,name变量的首地址是0,因为4字节对齐后,这是一个4的整数倍;age变量的地址为20,因为4字节对齐后,前面的name变量占用了20个字节,age刚好在其后面,也是一个4的整数倍;gender变量的地址为24,因为前面的age变量占用了4个字节,加上当前字节,刚好是一个4的整数倍;height变量的地址为28,因为前面的gender变量占用了1个字节,加上当前字节和1字节对齐需要的3个填充字节,刚好是一个4的整数倍。

所以,在定义结构体时,我们可以按照语言本身的默认4字节对齐方式,以兼容各种硬件平台,保证代码效率和兼容性。