C ++ copy-on-write子字符串/子数组

时间:2018-03-22 09:20:02

标签: c++ slice copy-on-write

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

我受到了Golang切片的影响,这些切片都具有最佳尺寸(ptr + len)。由于我们在C ++中没有真正的GC,因此写入时复制和重新计算可以使设计更合适。

在视觉上,我还要在相同的字符串/切片类下抽象出静态c字符串。

是否有一个解决方案可以提供所有:

  1. 在拍摄子串时避免复制。
  2. 写作时写时复制。
  3. 用相同的类包装静态c字符串。
  4. 不是OS /编译器特定的(即gcc的std :: string不起作用)。
  5. 如果没有,在实施时我还应该考虑什么? (我正在考虑使用原子操作来管理refcounts,并使用null refcount标记c-string。)

    编辑:

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

1 个答案:

答案 0 :(得分:2)

Adob​​e stlab库有copy-on-write功能的包装类。

但是,您可能会对Package Manager Console写作和std::string_view(C ++ 17)阅读感兴趣,因为它们是标准的。执行复制是一个新的Init.ps1,同时复制std::string只会复制它的描述(基本指针和大小)。

对于参考计数,有std::shared_ptrstd::enable_shared_from_this