C++ 可变大小的消息框

C++ 可变大小的消息框,c++,network-programming,C++,Network Programming,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 c

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
类型的对象中。然后我执行一次发送/接收

这不是一个简单的技巧,但根据我的经验,这是一种比其他方法(发送两条单独的消息和/或执行更多的铸造技巧)更简洁、清晰和高效的方法

那么,我的兴趣是问是否有更有效的技术,或者即使已经有一个设计模式或库来简化这些问题的解决方案

提前感谢您的关注

如果您正在使用,我不明白为什么这样做效率低下

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;
};
class Msg
{
公众:
Msg(大小、常量字符*常量数据)
{
m_数据=新字符[size+sizeof(size)];
//小心endiannes
memcpy(m_数据和大小,大小f(大小));
memcpy(m_数据+大小、数据、大小);
}
常量字符*
数据()常量
{
返回m_数据+sizeof(size_t);
}
尺寸
长度()常数
{
返回*重新解释铸型(m_数据);
}
~Msg()
{
删除[]m_数据;
}
私人:
char*m_数据;
};

您甚至可以添加
send()
receive()
方法,如果有什么好的理由说明这不好,我很想知道。

我认为这种方法可能适合您。查看更新。似乎
BaseMsg
是数据包的一部分。作者希望在不调用
get\u bytes()
等方法的情况下构造数据包。