Google的protobuf库中的MergeFrom* vs. ParseFrom*
MergeFrom* vs. ParseFrom* in Google's protobuf library
我似乎找不到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会导致message
获得payloadBuf
的所有权,还是message
制作基础数据的副本?如果message
确实复制了,那么我显然应该像prefixBuf
一样使用auto_ptr
来payloadBuf
。
感谢您的输入!
首先MergeFrom*
不像ParseFrom*
方法那样工作。 第一个工作原理类似于 Message 类中的MergeFrom
:
单数字段将被覆盖,但将被合并的嵌入式消息除外。重复的字段将被连接起来。
ParseFrom
是一个包装器,只需在调用MergeFrom
之前调用Clear
:
Clear() 避免释放内存,假设分配用于保存部分消息的任何内存都需要再次用于保存下一条消息。如果您确实要释放消息使用的内存,则必须将其删除。
因此,在您的消息被清除之前,所有重复的字段都将聚合新数据。
存储在序列化流中的数据是 Varint 编码的,因此解析是通过解释流中的数据并复制到 Message 对象字段中来完成的。
解析完成后,消息本身将不需要缓冲区。
查看 ArrayInputStream 的文档:
"数据"仍然是调用方的属性,但必须保持有效,直到 流被销毁。
所以不,它不拥有所有权,您应该确保在正确的时间释放内存。
我想您可能会对函数名称中使用单词Merge
感到困惑。它不是说"数据从传递的缓冲区合并"(我认为这导致您考虑所有权),而是"数据合并到消息中"。因此,Parse
在填充消息之前调用Clear()
,而Merge
则按原样直接使用您传递的消息。
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 正在VS调试器中监视映射条目
- Confusion: decltype vs std::function
- 将IBM Rhapsody模型集成到VS 2019中
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- 修改 VS Code 中的默认C++代码段
- 如何使用c++在VS 2019上运行SQL查询
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 完美前进使用 std::forward vs RefRefCast
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- consteval wrapper vs. source_location
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- Google的protobuf库中的MergeFrom* vs. ParseFrom*