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
类型的对象中将常量消息状态和一些其他数据连接到整个消息,其大小通常是可变的。然后我执行发送/接收一次。
这不是一种琐碎的技巧,但在我的谦虚体验中,比其他选择更简洁,清晰和有效(发送两个独立的消息和/或做更多的演员技巧)。
那么,我的兴趣是询问是否有更有效的技术,或者即使已经有一个设计模式或库来简化这些问题的解决方案。
提前感谢您的关注
答案 0 :(得分:1)
如果你正在使用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()
方法,如果有任何理由可以解决这个问题,我很想知道。