c – std :: shared_ptr可以作为引用计数不可变字符串的有效实现
理想情况下,不可变的字符串类只需要为每个字符串分配一个内存.甚至引用计数也可以存储在保存字符串本身的同一块内存中.
string和shared_ptr的简单实现将为shared_ptr< string const>分配三个不同的内存块: >字符串缓冲区的内存 现在,我知道在使用std :: make_shared()时,智能实现可以将最后两个组合成一个分配.但这仍然会留下两个分配. 当您知道字符串是不可变的时,字符串缓冲区将不会被重新分配,因此应该可以将它与字符串对象集成,只留下一个分配. 我知道一些字符串实现已经对短字符串使用了这样的优化,但我正在执行一个实现,无论字符串长度如何. 我的问题是:我的推理是否合理?实现是否允许并且能够执行此操作?我可以合理地期望从高质量的标准库中实现这种优化吗?您知道当代图书馆实施这样做吗? 或者这是我必须自己实现的东西? 解决方法
我相信唯一的方法是make_shared接受运行时变量大小的数组.标准的一个
does not,即使是c 17(它增加了对shared_ptr的支持到数组).
另一方面,Boost具有 如果你不想使用提升,你可以自己动手.它可能不会那么难. 还有一点需要考虑的是,如果你只创建O(1)字符串,那么永远不会删除它们会快得多,并传递原始指针(或std :: string_views).这可以避免任何复制或摆弄引用计数. (引用计数实际上非常慢,因为它们使用原子操作.) 您还可以使用std :: unordered_set< std :: string>等实习机制. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |