【发布时间】:2017-06-29 11:17:31
【问题描述】:
理想情况下,不可变字符串类只需要为每个字符串分配一个内存。甚至引用计数也可以存储在保存字符串本身的同一块内存中。
string 和 shared_ptr 的简单实现将为 shared_ptr<string const> 分配三个不同的内存:
- 字符串缓冲区的内存
- 字符串对象的内存
- 引用计数的内存
现在,我知道当使用std::make_shared() 时,智能实现可以将最后两个组合成一个分配。但这仍然会留下两个分配。
当你知道字符串是不可变的时,字符串缓冲区不会被重新分配,因此应该可以将它与字符串对象集成,只留下一个分配。
我知道一些字符串实现已经对短字符串使用了这种优化,但我正在追求一个不管字符串长度如何都这样做的实现。
我的问题是:我的推理合理吗?一个实现是否真的被允许并且能够做到这一点?我可以合理地期望一个高质量的标准库来实现这种优化吗?您知道这样做的当代图书馆实现吗?
或者这是我必须自己实现的东西?
【问题讨论】:
-
GCC 4.x 引用计数
std::string: stackoverflow.com/questions/12520192/… 。如果您使用-D_GLIBCXX_USE_CXX11_ABI=0编译,更高版本的 GCC 仍然有它。 -
@Caleth 这无济于事,它的工作原理与
make_shared很相似,只是它使用了显式分配器。 -
标准库中有一个引用计数的不可变字符串。拼写为
std::runtime_error。 -
@T.C.这让我几乎哈哈大笑... :) 但是字符串仍然是 separatley 分配的。所以仍然有两种分配:一种用于对象,一种用于字符串。
标签: c++ string immutability c++-standard-library