可变大小的消息帧

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()方法,如果有任何好的理由为什么这是不好的,我很想知道。