动态数组在通讯协议中的应用

本文介绍使用结构体作为数据承载格式的用法。

在使用结构体进行数据交互时,既需要使用到固定结构,又支持扩展,数据长度能够根据消息类型的不同而不同,这个时候,需要类似如下结构定义:

struct TCommonMsg
{
	int nMsgId;	   // 消息类型
	int nMsgLen;  // 消息长度
    char szBuf[i]; // 消息实际内容存储空间,其中i是可变的
}

c++要求在定义数组时,必须明确指出数组大小,否则编译失败。这种情况下,可以使用如下方式来定义:

struct TCommonMsg
{
	int nMsgId;	   // 消息类型
	int nMsgLen;  // 消息长度
    char szBuf[0]; // 定义动态数组
}

使用空数组来构建缓冲区有以下优点:

| 对比 | 使用指针 || 使用0长数组 |
| ---- | ---- |---- |
| 内存申请 | 先申请整个大小,再申请动态大小 | 只需申请一次 |
| 内存释放 | 先释放指针指向内存,再释放整体内存 | 释放一次 |
| 成员访问 | 先通过结构体得到指针成员,再通过指针访问 | 直接通过成员访问 |
| 占用空间 | 4字节指针大小 | 不占用空间 |

小结

在使用结构体作为通讯协议的承载格式时,建议使用动态数组的方式,操作和管理内存都方便,扩展性好。

posted @ 2021-10-19 09:07  浩天之家  阅读(101)  评论(0编辑  收藏  举报