c – std :: shared_ptr可以作为引用计数不可变字符串的有效实现吗?

理想情况下,不可变的字符串类只需要为每个字符串分配一个内存.甚至引用计数也可以存储在保存字符串本身的同一块内存中.

string和shared_ptr的简单实现将为shared_ptr< string const>分配三个不同的内存块:

>字符串缓冲区的内存
>字符串对象的内存
>参考计数的内存

现在,我知道在使用std :: make_shared()时,智能实现可以将最后两个组合成一个分配.但这仍然会留下两个分配.

当您知道字符串是不可变的时,字符串缓冲区将不会被重新分配,因此应该可以将它与字符串对象集成,只留下一个分配.

我知道一些字符串实现已经对短字符串使用了这样的优化,但我正在执行一个实现,无论字符串长度如何.

我的问题是:我的推理是否合理?实现是否允许并且能够执行此操作?我可以合理地期望从高质量的标准库中实现这种优化吗?您知道当代图书馆实施这样做吗?

或者这是我必须自己实现的东西?

最佳答案 我相信唯一的方法是make_shared接受运行时变量大小的数组.标准的一个
does not,即使是c 17(它增加了对shared_ptr的支持到数组).

另一方面,Boost具有boost::make_shared,它也可以采用数组大小​​参数.一旦你拥有了,你就是金色的;你得到一个shared_ptr< char []>它几乎可以满足您的需求(除了实际上是一个std :: string.

如果你不想使用提升,你可以自己动手.它可能不会那么难.

还有一点需要考虑的是,如果你只创建O(1)字符串,那么永远不会删除它们会快得多,并传递原始指针(或std :: string_views).这可以避免任何复制或摆弄引用计数. (引用计数实际上非常慢,因为它们使用原子操作.)

您还可以使用std :: unordered_set< std :: string>等实习机制.

点赞