【c/c++】c/c++通过取消结构体字节对齐的方法,实现高效的解析协议和打包协议

背景

在嵌入式程序通讯的过程中,往往需要发送协议,打包协议和解析协议的操作比较繁琐,如果可以用结构体按照协议定义成员变量。在解析协议和发送协议的时候效率会很高,但是实际测试发现成员变量长短不同时,在内存分配时,编译器会进行内存对齐。导致发送的数据会有多余的00存在。这时候我们用取消结构体字节对齐的方法可以解决这个问题。

默认字节对齐

‌结构体字节对齐‌是指在内存中分配数据时,按照一定的规则对数据进行对齐。这种对齐通常基于数据类型的大小,以确保数据在内存中的布局符合特定的要求。

程序代码

typedef struct
{
     char ch;
     int size;
     char str[10];
}test_t;
test_t mytest = {
    1,100,{1,2,3,4,5,6,7,8,9,10}
};
ESP_LOGW(TAG,"结构体长度:%d",sizeof(mytest));
ESP_LOG_BUFFER_HEX(TAG,(uint8_t*)&mytest,sizeof(mytest));

日志打印

MAIN: 结构体长度:20
MAIN: 01 00 00 00 64 00 00 00 01 02 03 04 05 06 07 08 09 0a 00 00

可以看到,char ch这个变量虽然是8位的,但是在内存中是01 00 00 00 .,占了32位。接下来我们取消字节对齐。

取消字节对齐

程序代码

#pragma pack(1)//1字节对齐,即不进行字节对齐
typedef struct
{
     char ch;
     int size;
     char str[10];
}test_t;
#pragma pack()//恢复字节对齐
test_t mytest = {
    1,100,{1,2,3,4,5,6,7,8,9,10}
};
ESP_LOGW(TAG,"结构体长度:%d",sizeof(mytest));
ESP_LOG_BUFFER_HEX(TAG,(uint8_t*)&mytest,sizeof(mytest));

日志打印

MAIN: 结构体长度:15
MAIN: 01 64 00 00 00 01 02 03 04 05 06 07 08 09 0a

由此可以看到,结构体取消字节对齐,可以让结构体按真实长度占用内存,使得在打包协议的时候。格式没有多余的00,在发送数据的时候,不需要单独打包数据,直接发送结构体就可以了,减少业务代码,但是需要留意大小端问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莲花码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值