理想情况下,一个不可变的字符串类只需要为每个字符串分配一次内存。即使引用计数可以存储在保存字符串本身的同一块内存中。可以std :: shared_ptr <std :: string const>作为引用计数的不可变字符串的有效实现吗?
甲琐碎实施string
和shared_ptr
将分配三个不同的存储器件为shared_ptr<string const>
:
- 内存为字符串缓冲区
- 存储器的字符串对象
- 存储器的引用计数
现在,我知道当使用std::make_shared()
时,智能impl将最后两个组合成一个单独的分配。但是这仍然会留下两个分配。
当您知道该字符串是不可变的时,字符串缓冲区将不会被重新分配,因此应该可以将其与字符串对象集成,只留下一个分配。
我知道某些字符串实现已经对短字符串使用了这样的优化,但是我在执行这个操作之后不管字符串长度如何。
我的问题是:我的推理的声音?实际上是否允许并能够执行此操作?我可以从一个高质量的标准库中合理地期望实现这种优化吗?你知道这样做的当代库实现吗?
或者这是我必须实现自己的东西?
GCC 4.x的已引用计数'的std :: string':https://stackoverflow.com/questions/12520192/is-stdstring-refcounted-in-gcc-4-x-c11。如果使用'-D_GLIBCXX_USE_CXX11_ABI = 0'进行编译,后续版本的GCC仍然有它。 –
看看[allocate_shared](http://en.cppreference。com/w/cpp/memory/shared_ptr/allocate_shared) – Caleth
@Caleth这没有什么帮助,它和'make_shared'非常类似,只是它使用了明确的分配器。 –