1、结构体对齐
按照结构体中最大字节元素的字节个数对齐,比方说有最大基本元素数据类型为int,按照4字节对齐。最大为short,按照2字节对齐。
typedef struct //最大的元素的基本数据类型为(int)4个字节
{
char numChar; //占据一个字节
int numInt; //第一个位只剩3字节,无法容下int,只能占据第二位(四字节为一个对齐单位)。
short numShort; //占据第三位,补上2个字节。
}test1; //sizeof(test1)=12;
typedef struct
{
int numInt;
char numChar;
short numShort;
}test2; //sizeof(test2)=8;
typedef struct
{
short numInt;
char hah;
short numShort;
char numChar;
}test3; //sizeof(test3)=8;
2、位域结构体
位结构体是一种特殊的结构体,在需访问某个字节或者某个字节的指定位的时候,位结构体比按位操作简便
typedef struct {
float adCheckValue; //AD判断阈值
int tianNum; //车号
struct{
char checkStatus : 4; //自检状态,占据第一个字节(char)的低四位。
char AlarmStatus : 4; //报警状态,占据第一个字节(char)的高四位。
ushort overFlowCnt : 8; //失稳溢出计数,占据第三个字节
ushort isOpen : 1; //占据第3个字节的第0位
}statusData; //4
}OriginalData; //12
位域:
位域是指为位为单位来定义某结构体的成员变量 它和结构体是分不开的
位域的一些使用:
1.位域变量仅限整型
2.位域变量的长度不能够超过其本身类型的长度
3.如果某一位域要从一个新的类型对齐处开始 可以在前面加一个长度为0的匿名位域 unsigned :0
4.匿名位域长度不为0时 只起占位的作用
5.一个位域必须容纳在同一个其类型对齐长度内
关于位域对齐更多资料(网上摘录):
/*************************************************************************
C99规定int、unsigned int和bool可以作为位域类型,但编译器几乎都对此作了扩展,
允许其它类型类型的存在。
使用位域的主要目的是压缩存储,其大致规则为:
1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;(经测试此条好像仅限于char型,整型可以跨域存储)
3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。
***************************************************************************/
struct s1
{
int i: 8;
int j: 4;
int a: 3;
double b;
};
struct s2
{
int i: 8;
int j: 4;
double b;
int a:3;
};
printf("sizeof(s1)= %d\n", sizeof(s1));
printf("sizeof(s2)= %d\n", sizeof(s2));
result: 16, 24
第一个结构体中,i,j,a共占15个位,不足8个字节,按double 8字节对齐,共16字节
第二个结构体中,i,j共占12位,不足8字节,按8字节对齐,a也按8字节对齐,加上double共8+8+8=24个字节
3.具体例子测试:
https://blog.csdn.net/lizi_stdio/article/details/77203335
注意自己运行一下,该博客给的答案部分有问题。
转载:
1.https://www.cnblogs.com/xian-yongchao/p/9542561.html
2.https://blog.csdn.net/WUDAIJUN/article/details/8196829?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link
3.https://blog.csdn.net/lizi_stdio/article/details/77203335