结构体位段:
例如:
struct tagPIM
{
unsigned char ucPim1;
unsigned char ucData0 : 1;
unsigned char ucData1 : 2;
unsigned char ucData2 : 3;
}*pstPimData;
char ucpim1占用一个字节
而ucData0在第二个字节中只占1个比特位
ucDATa1在第二个字节中占用2个比特位
ucData2在第二个字节中占用3个比特位
若在其中任何一个过程中前面的变量已经将一个字节占下剩余的空间不足以放下一个变量,
则令创建一个字节为下一个变量存储。
例如
struct tagPIM
{
unsigned char ucPim1;
unsigned char ucData0 : 1;
unsigned char ucData1 : 5;
unsigned char ucData2 : 3;
}pstPimData;
printf("%d", sizeof(pstPimData));
此时打印结果为pstPimData的大小为3个字节,即开创第四个变量的时候第二个字节已经放不下了,则直接浪费第二个字节的前两个比特位,另外开创第三个字节存储ucData2。
结构体内存对齐:
struct A{
char a;
cahr b;
int c;
};
struct B{
char a;
int b;
char c;
};
例如上述案例,结构体中元素是一样的,但是所占的内存空间不同;
前者占8个字节,而后者占12个字节。
vs环境默认的对齐数为8,所求对齐数为类型与默认对齐数大小的较小值。
规则:
1.存储一个变量必须要处于字节对齐数的整数倍
2.所有变量存储结束以后,整体所占字节大小要求能被结构体中最大变量所占字节大小整除。
3.如果结构体嵌套,则嵌套的结构体的对齐数为嵌套的结构体自身变量中的最大变量所占字节。
联合体:
union Un
{
short s[7];
int n;
};
联合体中所有变量所占字节均为重复使用。
联合体大小必须能被其包含的所占字节最大变量整除。