#pragma pack(push, 1) //**********上面为代码段1*************** struct pack_bit //**********上面为代码段2*************** struct pack_bit //**********上面为代码段3*************** 这是俺在优快云上的第一篇文章。 先介绍位结构在C++所写程序中的作用。合理的利用位结构能用最少的空间表达最丰富的内容,我想这是位结构的设计目的吧。关于位结构的一般使用方法在MSDN 的“C++ Bit Fields”中进行了详细的介绍,我只是说明一下在使用过程中需要注意的问题。 位结构成员变量类型注意,如代码段2和代码段3中,成员变量a在2中类型是unsigned char,在3中类型是unsigned int,虽然都是一位,但是sizeof后,我们会看到,代码段2大小为4,代码段大小为8(为什么不是3和7的原因是因为编译器的对齐,后面介绍)。所以我们在决定成员变量类型时一定要以成员变量所占的位数及实际的需要为出发点,否则定义出来的结构大小与实际可能不否。 再说#pragma预编译指令在定义位结构中所起的作用。#pragma pack(push,n)和#prama pack(pop)构成一对设置编译器对齐的指令,在这里只说用在位结构下,n代表是以几个byte做最小的对齐方案。如代码段1的大小是3,而代码段2的大小是4,这是由于代码段1中强制的将对齐设置为1,而代码段没有设置为1,所以要按成员变量中字节数最多的类型作为对齐字节数的基准。 另外,我们也可以看到代码段3结构长度为8。 对齐在工业上也是有很多的应用的,比如串口传输帧长为27个字节的数据串,可以将接收到的27个字符串数据直接memcpy到定义好的位结构中,等等。
struct pack_bit
{
unsigned char a : 1;
unsigned char b : 1;
unsigned char c : 1;
unsigned char d : 3;
short e : 9;
};
#pragma pack(pop)
{
unsigned char a : 1;
unsigned char b : 1;
unsigned char c : 1;
unsigned char d : 3;
short e : 9;
};
{
unsigned int a : 1;
unsigned char b : 1;
unsigned char c : 1;
unsigned char d : 3;
short e : 9;
};