+-
我似乎无法在protobuf中找到 MessageLite类的MergeFrom *和ParseFrom *方法之间的明显区别.
我试图最小化我必须做的数据复制量,所以我在下面编写了以下代码来解码长度前缀消息:
bool StreamMessageDelimiter::receiveWithLengthPrefix(Message& message)
{
google::protobuf::uint32 messageSize;
auto_ptr<google::protobuf::uint8> prefixBuf(new google::protobuf::uint8[sizeof(messageSize)]);
int receivedBytes = receiveNBytes(prefixBuf.get(), sizeof(messageSize));
if(receivedBytes != sizeof(messageSize))
{
return false;
}
CodedInputStream prefixInput(prefixBuf.get(), sizeof(messageSize));
prefixInput.ReadLittleEndian32(&messageSize);
google::protobuf::uint8* payloadBuf = new google::protobuf::uint8[messageSize];
receivedBytes = receiveNBytes(payloadBuf, messageSize);
if(receivedBytes != messageSize)
{
return false;
}
ArrayInputStream rawInput(payloadBuf, messageSize);
CodedInputStream codedInput(&rawInput);
if(!message.MergeFromCodedStream(&codedInput))
{
return false;
}
return true;
}
我的问题是使用MergeFromCodedStream原因消息来获取payloadBuf的所有权,还是消息制作了底层数据的副本?如果消息确实复制了,那么我显然应该使用auto_ptr for payloadBuf,就像我为prefixBuf所做的那样.
感谢您的投入!
最佳答案
查看 ArrayInputStream的文档:
“data” remains the property of the caller but must remain valid until
the stream is destroyed.
所以不,它不占用所有权,你应该确保在合适的时间释放内存.
我想你可能会对函数名中使用Merge这个词感到困惑.它并没有说“数据从传递的缓冲区合并”(我认为这会让你考虑所有权),而是“数据被合并到消息中”.因此,Parse在填充消息之前调用Clear(),而Merge使用您按原样直接传递的消息.
点击查看更多相关文章
转载注明原文:c – Google的protobuf库中的MergeFrom *与ParseFrom * - 乐贴网