- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的应用程序多次发送 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/
我的应用程序多次发送 varint。每次我必须为 2 个对象分配内存:CodedOutputStream 和 FileOutputStream,然后再释放它。 IMO 这是不必要的时间损失。如果没有所
我是一名优秀的程序员,十分优秀!