C++ 中的 string slice
2019-09-07 23:17 programming
最近在读 LLVM 的代码, 发现了它里面也实现了 string slice 字符串引用的功能.
在之前, 已经在 leveldb 以及 re2 中见过类似的实现, 当然, 类似的 功能在 chromium 的代码中有更复制的实现.
之所以这些开源软件中要独立实现一套 string slice, 我觉得有这几个原因:
- cpp 中要支持
std::string
以及const char*
这两种字符串类型, 而这两种类型实现的 某些操作方法, 并不一致 - 标准库中的 字符串类型缺少一些功能
- 作为值传递时, 尽可能减少内存复制
它们实现的 string slice 可以实现以上目标:
- string slice 并不存储字符串 buffer, 而只存一个指向原始 buffer 的一个指针
- string slice 实现了一些通用方法, 比如:
size()
empty()
starts_with()
operator==()
clear()
set()
compare()
这样一来, 软件内部接口之间只需要传递 string slice 即可, 不需要再区分 std::string
以及 const char*
了.
当然了, 也有见过在 string slice 类中实现字符串哈希的, 以加快字符串比对速度.
Rust 中的 string slice
rust 核心库中即定义了 string slice, &str
, 对应于 String
结构体. 因为标准库本身
只有 String 这一个字符串类, 所以 &str
不需要兼容别的类型.
但对于FFI, 标准库中还定义了 CString
, 对应的 string slice 是 cstr
, 它们用于
调用本地接口时传递字符串.