【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,在发送数据的时候,不需要单独打包数据,直接发送结构体就可以了,减少业务代码,但是需要留意大小端问题。

你可能感兴趣的:(c/c++,c语言,c++,开发语言)