2015-09-27 3 views
1

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. Затем я выполняю отправку/получение один раз.

Это не тривиальный метод, но в моем скромном опыте более кратким, понятным и эффективным способом, чем другие альтернативы (отправка двух отдельных сообщений и выполнение других трюков).

Ну, теперь я заинтересован в том, есть ли более эффективные методы или даже если есть шаблон дизайна или библиотека, которая упрощает решение таких проблем.

Заранее спасибо за внимание

ответ

1

Если вы используете я не могу понять, почему это было бы неэффективно

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() и методы, если есть хорошая причина, почему это плохо, я хотел бы знать.

+1

Я думаю, что этот подход может сработать для вас. См. Обновление. –

+1

Кажется, что 'BaseMsg' является частью пакета. Автор хочет построить пакет без вызова методов типа 'get_bytes()'. –

Смежные вопросы