slice — C ++ копировать при записи подстрока / подрешетка

У меня много обработки текста (например, xml, json, yaml), и я хотел бы, чтобы все проанализированные подстроки ссылались на буфер ввода, а не копировали.

На меня влияют срезы Голанга, которые имеют оптимальный размер (ptr + len). Поскольку у нас на самом деле нет GC в C ++, возможно, копирование при записи и refcounts делают более подходящий дизайн.

Опционально, я бы абстрагировал также статические c-строки в том же классе string / slice.

Есть ли одно решение, которое обеспечивает все:

  1. Избегайте копирования при взятии подстрок.
  2. Копии на запись при записи.
  3. Оборачивает статические c-строки с тем же классом.
  4. Не зависит от ОС / компилятора (т.е. std :: string у gcc не будет работать).

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

РЕДАКТИРОВАТЬ:

  • std :: string_view не годится, так как не содержит требования 2.
  • Конкретный сценарий: я бы хотел проанализировать документ json, не создавая много копий подстрок. Тогда я бы хотел изменить только одно строковое значение.

1

Решение

В библиотеках Adobe stlab есть класс-оболочка для копирование при записи funcionality.

Тем не менее, вы могли бы быть заинтересованы просто пойти с std::string для написания и std::string_view (C ++ 17) для чтения, так как они стандартные. Выполнение копии — это вопрос создания нового std::stringтем временем копируя std::string_view будет только копировать его описание (базовый указатель и размер).

Для подсчета ссылок есть std::shared_ptr а также std::enable_shared_from_this

2

Другие решения

Других решений пока нет …