可变大小的消息帧
Message frame with variable size
本文关键字:消息 更新时间:2023-10-16
gcc编译器允许声明如下:
struct Msg : public BaseMsg // BaseMsg could contain the message code and common stuff to all the diferent messages frames
{
// some class state stuff whose layout must be contiguous
size_t len; // length of variable data
char buffer[0]; // here one could put data of variable size
};
在过去,我使用这种风格来管理消息框架。例如,我可以这样做:
Msg * msg = (Msg*) malloc(sizeof(Msg) + additional_length);
memcpy(msg->buffer, /* some src addr for additional data */, additional_length);
通过这种方式,我可以将常量消息状态和与整个消息相邻的一些附加数据(其大小通常是可变的)放在类型为Msg
的对象中。然后执行一次发送/接收。这不是一个微不足道的技术,但在我的经验中,它比其他替代方法(发送两个分开的消息或做更多的类型转换技巧)更简洁,更清晰,更有效。
那么,我的兴趣是问是否有更有效的技术,甚至是否已经有一个设计模式或库来简化这些问题的解决方案。
提前感谢您的关注
如果你正在使用c++,我不明白为什么这会是低效的
class Msg
{
public:
Msg(size_t size, const char *const data)
{
m_data = new char[size + sizeof(size)];
// Be careful with endiannes
memcpy(m_data, &size, sizeof(size));
memcpy(m_data + size, data, size);
}
const char *
data() const
{
return m_data + sizeof(size_t);
}
size_t
length() const
{
return *reinterpret_cast<size_t *>(m_data);
}
~Msg()
{
delete[] m_data;
}
private:
char *m_data;
};
你甚至可以添加send()
和receive()
方法,如果有任何好的理由为什么这是不好的,我很想知道。
相关文章:
- boost::进程间消息队列引发错误
- 在线编译器中的分段C++没有打印消息
- C++错误消息*成员参考.**初学者*
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何通过参数抛出错误消息
- 从服务器传输到客户端的消息不会出现
- ROS2 动态消息模板
- C++秘密消息学校作业
- glad 导致 glfwSwapBuffers 返回错误消息
- C++入门 5 版:类消息和文件夹
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 如何接受 [ENTER] 键作为无效输入并发送错误消息
- 由于无效的 ValidateRgn() 子窗口不会收到WM_PAINT消息
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 如何将 Firebase 与基于 Linux 的客户端应用配合使用,以便与服务器进行双向消息通信
- 重新定义预定义的 errno 错误消息 (E2BIG)
- Libmosquitto publish 不会将所有消息传递到 Azure IoT Hub
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息