我研究了String
的源代码,发现它是用Vec
实现的,它没有小对象优化的形式:
pub struct String {
vec: Vec<u8>,
}
来自C++,在C++中,每个主要的标准库都使用std::string
的短串优化(SSO),这令人惊讶.
字符串的许多用例都涉及非常短的字符串,例如:
- 如果您正在编写编译器,您将拥有关键字和标记的字符串,如
"=="
、"pub"
、"delete"
- 如果要将枚举串行化,则所有常量名称通常都足够短,可以放入SSO缓冲区
- 如果使用格式字符串打印内容,格式字符串很少会长到无法放入SSO中
- 如果要解析具有键和值的配置文件,键和值通常都非常短,如
setting: enabled
- 如果您存储的是正则表达式,那么这些正则表达式通常也适合SSO
- 如果你正在存储一本词典,那么几乎所有的词典都可以被SSO,因为例如,英语单词相当短
在这种情况下,默认的String
不使用任何SSO的理由是什么?是否可以追溯添加该功能?有没有任何分析数据来证明SSO是否有帮助?
关于C++中SSO的注记
SSO是通过重用std::string
容器的内存来完成的,否则这些内存将存储要存储的指针、大小和容量:
- 内部字符串的大小(可以只有一个字节)
- 容器中的字符串数据(通常最大长度为~20字节)
也有可能只重用容量,并且有一个指向字符串对象内部的指针.
所有这一切通常都是通过union
完成的,在铁 rust 公司也是可能的.