📅  最后修改于: 2023-12-03 14:38:52.881000             🧑  作者: Mango
在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字节对齐方式,以兼容各种硬件平台,保证代码效率和兼容性。