gpt4 book ai didi

c++ - 谷歌 protobuf 库中的 MergeFrom* 与 ParseFrom*

转载 作者:太空狗 更新时间:2023-10-29 20:28:30 26 4
gpt4 key购买 nike

我似乎找不到 MessageLiteMergeFrom*ParseFrom* 方法之间的明确区别。 protobuf 中的类。

我试图尽量减少我必须做的数据复制量,所以我在下面编写了以下代码来解码长度前缀消息:

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导致 message 获得 payloadBuf 的所有权,或者 message 是否复制了底层数据?如果 message 确实复制了一份,那么我显然应该为 payloadBuf 使用 auto_ptr 就像我为 prefixBuf 所做的那样>.

感谢您的输入!

最佳答案

首先 MergeFrom* 不像 ParseFrom* 方法那样工作。第一个像 Message 类中的 MergeFrom 一样工作:

Singular fields will be overwritten, except for embedded messages which will be merged. Repeated fields will be concatenated.

ParseFrom 是一个包装器,在调用 MergeFrom 之前简单地调用 Clear:

Clear() avoids freeing memory, assuming that any memory allocated to hold parts of the message will be needed again to hold the next message. If you actually want to free the memory used by a Message, you must delete it.

因此,在您的消息被清除之前,所有重复的字段都会聚合新数据。

序列化流中存储的数据为Varint encoded , 因此解析是通过解释流中的数据并复制到消息对象字段中来完成的。

解析完成后,消息本身将不需要缓冲区。

关于c++ - 谷歌 protobuf 库中的 MergeFrom* 与 ParseFrom*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12920583/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com