C++中位结构的使用注意及#pragma预编译指令的作用

本文详细介绍了C++中位结构的使用方法及其注意事项,包括成员变量类型的选取原则、#pragma预编译指令的作用以及编译器对齐的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#pragma pack(push, 1)
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)
 

//**********上面为代码段1***************

 

struct pack_bit
{
 unsigned char a : 1;
 unsigned char b : 1;
 unsigned char c : 1;
 unsigned char d : 3;
 short e : 9;
};

//**********上面为代码段2***************

 

struct pack_bit
{
 unsigned
int a : 1;
 unsigned char b : 1;
 unsigned char c : 1;
 unsigned char d : 3;
 short e : 9;
};

//**********上面为代码段3***************

 

      这是俺在优快云上的第一篇文章。

      先介绍位结构在C++所写程序中的作用。合理的利用位结构能用最少的空间表达最丰富的内容,我想这是位结构的设计目的吧。关于位结构的一般使用方法在MSDN “C++ Bit Fields”中进行了详细的介绍,我只是说明一下在使用过程中需要注意的问题。

      位结构成员变量类型注意,如代码段2和代码段3中,成员变量a2中类型是unsigned char,在3中类型是unsigned int,虽然都是一位,但是sizeof后,我们会看到,代码段2大小为4,代码段大小为8(为什么不是37的原因是因为编译器的对齐,后面介绍)。所以我们在决定成员变量类型时一定要以成员变量所占的位数及实际的需要为出发点,否则定义出来的结构大小与实际可能不否。

      再说#pragma预编译指令在定义位结构中所起的作用。#pragma pack(push,n)和#prama pack(pop)构成一对设置编译器对齐的指令,在这里只说用在位结构下,n代表是以几个byte做最小的对齐方案。如代码段1的大小是3,而代码段2的大小是4,这是由于代码段1中强制的将对齐设置为1,而代码段没有设置为1,所以要按成员变量中字节数最多的类型作为对齐字节数的基准。

      另外,我们也可以看到代码段3结构长度为8。

      对齐在工业上也是有很多的应用的,比如串口传输帧长为27个字节的数据串,可以将接收到的27个字符串数据直接memcpy到定义好的位结构中,等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值