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_ptr
forを使用する必要があります。payloadBuf
prefixBuf
入力していただきありがとうございます!