Скопируйте плоский буфер для дальнейшей обработки - PullRequest
0 голосов
/ 15 мая 2019

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

char buf[] = recv(...);
const MyMessage* msg = GetSizePrefixedMyMessage(buf);
process(msg);
MyMessage *saved = Copy(msg) ??? how can I copy it?

Поскольку каждое поле сообщения плоских буферовявляется функцией-членом вместо реальных данных, поэтому я не могу просто использовать memcpy, верно?Есть предложения?

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

MyMessage * сохранено = Копировать (сообщение) ??? как я могу скопировать это?

Вы должны иметь возможность скопировать его с помощью конструктора копирования, учитывая, что он определен:

MyMessage saved(*msg); // If you like to have it on the stack, 
    // but will get destroyed as soon as you leave the scope. 
    // Preferred way unless MyMessage is big
MyMessage* saved= new MyMessage(*msg); // Could be auto instead of MyMessage*. 
    // We don't do this anymore on modern C++, you need a call to delete
auto saved= std::make_unique<MyMessage>(*msg); // This gets deleted automatically
    // falling out of scope

Если у вас нет конструктора копирования, но есть оператор присваивания:

MyMessage saved; 
saved= *msg; // Copy
MyMessage* saved= new MyMessage();
*saved= *msg; // Copy
auto saved= std::make_unique<MyMessage>();
*saved= *msg; // Copy

Учитывая, что эти два сбоя, если MyMessage является простой структурой (без указателей, без виртуальных), вы могли бы сделать:

MyMessage saved;
memcpy(&saved, msg, sizeof(MyMessage));
MyMessage* saved= new MyMessage();
memcpy(saved, msg, sizeof(MyMessage));
auto saved= std::make_unique<MyMessage>();
memcpy(saved.get(), msg, sizeof(MyMessage));
0 голосов
/ 15 мая 2019

Вы не можете memcpy указатель доступа msg, но вы можете просто memcpy оригинал buf.

...