3

protobufのMessageLiteMergeFrom*クラスのメソッドと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が実際にコピーを作成する場合は、 に対して行ったように、明らかにauto_ptrforを使用する必要があります。payloadBufprefixBuf

入力していただきありがとうございます!

4

2 に答える 2

2

ArrayInputStreamのドキュメントを確認してください。

「データ」は呼び出し元のプロパティのままですが、ストリームが破棄されるまで有効である必要があります。

いいえ、所有権はありません。適切なタイミングでメモリを解放する必要があります。

Merge関数名での単語の使用に混乱する可能性があると思います。「データは渡されたバッファからマージされます」(所有権を考慮したと思います)とは言わず、むしろ「データはメッセージにマージされます」。したがって、メッセージを埋める前にParse呼び出しますが、直接渡したメッセージをそのまま使用します。Clear()Merge

于 2012-10-16T22:19:13.283 に答える