+-
c – Google的protobuf库中的MergeFrom *与ParseFrom *
我似乎无法在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 * - 乐贴网