отправить varint без удаления CodedOutputStream, ZeroCopyOutputStream - PullRequest
1 голос
/ 06 июня 2011

Мое приложение отправляет варианты много раз. Каждый раз, когда мне нужно выделить память для 2 объектов: CodedOutputStream и FileOutputStream, а затем освободить его. ИМО это лишняя потеря времени. Как я могу отправить 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] ПРОВЕРИТЬ не удалось: (buffer_used_) == (buffer_size_): BackUp () может быть только вызывается после Next (). прекратить называется после броска экземпляра 'Google :: Protobuf :: FatalException'
что (): ПРОВЕРИТЬ не удалось: (buffer_used_) == (buffer_size_): BackUp () может быть вызван только после Next (). Остановился

Когда я использую закомментированную часть кода вместо соответствующей, все работает нормально.

1 Ответ

0 голосов
/ 06 июня 2011

Вам не нужно размещать CodedOutputStream в куче, вы можете просто объявить его как локальную переменную (или член класса) там, где вам это нужно.Не похоже, что конструктор особенно дорог.

Вы всегда пишете в один и тот же файл?Если это так, вы можете просто использовать один CodedOuputStream и FileOutputStream для всех записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...