gpt4 book ai didi

c++ - 在不删除 CodedOutputStream、ZeroCopyOutputStream 的情况下发送 varint

转载 作者:太空宇宙 更新时间:2023-11-04 14:22:48 25 4
gpt4 key购买 nike

我的应用程序多次发送 varint。每次我必须为 2 个对象分配内存:CodedOutputStream 和 FileOutputStream,然后再释放它。 IMO 这是不必要的时间损失。如果没有所有这些过程,我如何发送 varint? (我不想手动完成,而是使用 protobuf)


我找到了:

delete coded_output;
/* delete raw_output;*/
((FileOutputStream*)raw_output)->Flush();

但每次仍然有一个对象要分配


  void Connection::send(const Message& msg) throw(EmptyMessage) {
//CodedOutputStream* coded_output = new CodedOutputStream(raw_output);
CodedOutputStream coded_output(raw_output);
int n = msg.ByteSize();
if(n<=0) throw EmptyMessage();
//coded_output->WriteVarint32(n);
coded_output.WriteVarint32(n);
//delete coded_output;
coded_output.~CodedOutputStream();
raw_output->Flush();
msg.SerializeToArray(buffer, n);
SocketMaintenance::write(buffer, n);
}

Annoucement Connection::receive() throw(EmptySocket) {
//CodedInputStream* coded_input = new CodedInputStream(raw_input);
CodedInputStream coded_input(raw_input);
google::protobuf::uint32 n;
//coded_input->ReadVarint32(&n);
coded_input.ReadVarint32(&n);
char *b;
int m;
//coded_input->GetDirectBufferPointer((const void**)&b, &m);
coded_input.GetDirectBufferPointer((const void**)&b, &m);
Annoucement ann;
ann.ParseFromArray(b, n);
return ann;
}

当我使用上面的代码时,我从我的客户端应用程序中得到这个错误(运行时错误)(这个应用程序只使用发送函数):

libprotobuf FATAL google/protobuf/io/zero_copy_stream_impl_lite.cc:346] CHECK failed: (buffer_used_) == (buffer_size_): BackUp() can only be called after Next(). terminate called after throwing an instance of 'google::protobuf::FatalException'
what(): CHECK failed: (buffer_used_) == (buffer_size_): BackUp() can only be called after Next(). Stopped

当我使用注释掉的代码部分而不是相应的部分时,一切正常。

最佳答案

您不必在堆上分配 CodedOutputStream,只需在需要的地方将其声明为局部变量(或类成员)即可。看起来构造函数并不是特别昂贵。

你总是写入同一个文件吗?如果是这样,您可以只使用一个 CodedOuputStream 和 FileOutputStream 进行所有写入。

关于c++ - 在不删除 CodedOutputStream、ZeroCopyOutputStream 的情况下发送 varint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6248617/

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