一、字节对齐:(定义结构体变量的先后顺序不一样,所占用的内存也不一样)
字节对齐原则: 1) 结构体成员按自身字节大小自对齐:
自对齐指的是结构体成员的在内存中的起始地址必须是它的自身长度的整数倍。如int型变量(4字节),它 的起始地址必须能被4整除。例外:double类型的变量(8字节),它的起始地址只需能被4整除即可。
2)数据补齐:
结构体的总大小是结构体成员中最大成员的整数倍(如果这个最大的成员的数据类型是double,只需是4的 倍数即可)
举例:
struct align{ struct align{ struct align{
char a; char a; int a;
int b; char b; char b;
char c; int c; char c;
}a1; }a2; }a3;
sizeof(a1) == 12 sizeof(a2) == 8 sizeof(a3) == 8
a1中:a从地址0开始存放,占用一个字节,由于要对齐,b从地址4开始存放,占用4个字节,c从地址8开始存放,占用1个字节。总共9个字节,9不是4(sizeof(b) == 4)的倍数,所以根据数据补齐原则,sizeof(a1)== 12
a2中:a从地址0开始存放,占用1一个字节,b从地址1开始存放,占用1个字节,由于要对齐,c从地址4开始存放,占用4个字节。总共8个字节,8是4(sizeof(c) == 4)的倍数,所以sizeof(a2)== 8
a3中:a从地址0开始存放,占用4一个字节,b从地址4开始存放,占用1个字节,c从地址5开始存放,占用1个字节。总共6个字节,6不是4(sizeof(a) == 4)的倍数,所以根据数据补齐原则,sizeof(a3)== 8
二、联合体/共用体(union):
可能很多程序员工作了很久也没用过联合体,尤其是应用层开发的程序员,但是做裸板开发的应该经常见到。最常见的一种用法应该是这样的:
struct st_pubflag
{
union
{
uint WORD;
struct
{
uint rsv:4;
uint switch12:1;
uint switch11:1;
uint switch10:1;
uint switch9:1;
uint switch8:1;
uint switch7:1;
uint switch6:1;
uint switch5:1;
uint switch4:1;
uint switch3:1;
uint switch2:1;
uint switch1:1;
uint switch0:1;
}BIT;
}DATA;
};
这是一种union结合位段的使用方法,每个switch的值只是0或1,所以如果定义为char,太浪费内存了,使用union可以更方便的统一处理这些switch变量,比如直接给WORD赋值为0,则所有的switch就会否被赋值为0.