分类

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, 它们用于 调用本地接口时传递字符串.