C++写入时复制子字符串/子数组

C++ copy-on-write substring/subarray

本文关键字:字符串 数组 复制 C++      更新时间:2023-10-16

我有很多文本处理(例如.xml,json,yaml),我希望所有解析的子字符串都引用输入缓冲区,而不是复制。

我有点受到Golang切片的影响,它们都具有最佳大小(ptr + len)。由于我们实际上没有C++的GC,因此写入时复制和引用计数可能会使设计更合适。

或者,我会在同一字符串/切片类下抽象出静态 c 字符串。

有没有一种解决方案可以提供所有:

  1. 在获取子字符串时避免复制。
  2. 写作时复制。
  3. 同一类包装静态 c 字符串。
  4. 不是特定于操作系统/编译器的(即 gcc 的 std::string 不起作用)。

如果没有,在实施时我还应该考虑什么?(我正在考虑使用原子操作来管理引用计数,并用空引用计数标记 c 字符串)。

编辑:

  • std::string_view 不好,因为它不提供要求 2。
  • 具体场景:我想解析 json 文档而不创建许多子字符串副本。然后我只想更改一个字符串值。

Adobe stlab 库有一个用于写入时复制功能的包装类。

但是,您可能只对使用std::string进行写作和std::string_view(C++17)进行阅读感兴趣,因为它们是标准的。执行复制是创建新std::string的问题,同时复制std::string_view只会复制它的描述(基本指针和大小)。

对于引用计数,有std::shared_ptrstd::enable_shared_from_this