理想情况下,一个不可变的字符串类只需要为每个字符串分配一次内存。甚至引用计数也可以存储在持有字符串本身的同一块内存中。
一个
当你知道字符串是不可变的,字符串缓冲区不会被重新分配,因此应该可以将其与字符串对象集成,只留下一个分配。
我知道一些字符串实现已经对短字符串使用了这样的优化,但我希望有一种实现可以无论字符串长度如何都进行这种优化。
我的问题是:我的推理合理吗?是否允许实现这样的优化?我能否合理地期望优质标准库实现此优化?您是否知道当前的库实现可以实现此功能?
还是说这是我必须自己实现的东西?
一个
string
和 shared_ptr
的简单实现会为 shared_ptr<string const>
分别分配三个不同的内存块:
- 字符串缓冲区的内存
- 字符串对象的内存
- 引用计数的内存
std::make_shared()
时,一个聪明的实现可以将后两者合并为单个分配。但这仍然会留下两个分配。当你知道字符串是不可变的,字符串缓冲区不会被重新分配,因此应该可以将其与字符串对象集成,只留下一个分配。
我知道一些字符串实现已经对短字符串使用了这样的优化,但我希望有一种实现可以无论字符串长度如何都进行这种优化。
我的问题是:我的推理合理吗?是否允许实现这样的优化?我能否合理地期望优质标准库实现此优化?您是否知道当前的库实现可以实现此功能?
还是说这是我必须自己实现的东西?
std::string
:https://dev59.com/aGcs5IYBdhLWcg3w3HoG。如果使用`-D_GLIBCXX_USE_CXX11_ABI=0`编译,较新版本的GCC仍然具有此功能。 - John Zwinckmake_shared
,只是使用了显式分配器。 - Some programmer dudestd::runtime_error
。 - T.C.