Конструктор константной строки, который не выделяет память для символов?

StackOverflow https://stackoverflow.com//questions/20039111

  •  21-12-2019
  •  | 
  •  

Вопрос

Я пытаюсь оптимизировать написанный мною код для обработки нескольких уровней протокола приложения.Я широко использовал std::string class и стремился к простоте, а не к преждевременной оптимизации.Приложение работает слишком медленно и Валгринд & гпроф show Я трачу много времени на копирование строк, поскольку буфер перемещается вверх по моему стеку.

Мне кажется, что после копирования символов из системного буфера в самый нижний буфер приложения я смогу больше не копировать данные:в конце концов, он не мутирует при перемещении вверх по стеку.

Мой формат протокола представляет собой «передачу», состоящую из одного или нескольких завершающихся новой строкой записи, каждый из которых состоит из нескольких разделенных табуляцией поля, и завершается специальным токеном.Например.

RECORD 1\tHAS\tTHESE\tFIELDS\nRECORD 2\tLOOKS\tLIKE\tTHIS\nEND-OF-TRANSMISSION\n

Это будет собрано в одном std::string называется input_buffer.

Обработка передачи включает в себя извлечение записывать из буфера и передача его на следующий уровень;извлечение вектора поля из записи и передача ее на следующий слой;сохранение полей на карте.На каждом этапе данные копируются по мере выделения новых std::strings.

Можно ли выделить константную строку из индекса в input_buffer, а длину...без какого-либо копирования?Например, RECORD 2 начинается со смещения 26 и имеет длину 24 символа:

const std:string record (substr(input_buffer, 26), 24 );

Я не знаком с внутренностями строкового объекта, но его гарантии производительности, похоже, подразумевают, что где-то есть простая последовательность символов и почти наверняка указатель на память этих символов.Может ли этот указатель быть инициализирован в памяти, принадлежащей другой строке?

(Мой компилятор — g++ 4.7, но если для этого требуется версия 4.8, я бы тоже хотел об этом узнать.)

Это было полезно?

Решение

Насколько я понимаю, это хороший кандидат на повышение::string_ref.Вы бы просто сделали boost::string_ref input(input_buffer); а затем пройти string_refВместо этого он поднимается вверх по стеку.Единственное, о чем вам нужно беспокоиться, — это постоянно поддерживать исходный буфер в рабочем состоянии.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top