动态数组在通讯协议中的应用
本文介绍使用结构体作为数据承载格式的用法。
在使用结构体进行数据交互时,既需要使用到固定结构,又支持扩展,数据长度能够根据消息类型的不同而不同,这个时候,需要类似如下结构定义:
struct TCommonMsg
{
int nMsgId; // 消息类型
int nMsgLen; // 消息长度
char szBuf[i]; // 消息实际内容存储空间,其中i是可变的
}
c++
要求在定义数组时,必须明确指出数组大小,否则编译失败。这种情况下,可以使用如下方式来定义:
struct TCommonMsg
{
int nMsgId; // 消息类型
int nMsgLen; // 消息长度
char szBuf[0]; // 定义动态数组
}
使用空数组来构建缓冲区有以下优点:
| 对比 | 使用指针 || 使用0长数组 |
| ---- | ---- |---- |
| 内存申请 | 先申请整个大小,再申请动态大小 | 只需申请一次 |
| 内存释放 | 先释放指针指向内存,再释放整体内存 | 释放一次 |
| 成员访问 | 先通过结构体得到指针成员,再通过指针访问 | 直接通过成员访问 |
| 占用空间 | 4字节指针大小 | 不占用空间 |
小结
在使用结构体作为通讯协议的承载格式时,建议使用动态数组的方式,操作和管理内存都方便,扩展性好。