背景

  • 很多时候,当传入一个字符串到函数时,往往只是读取字符串时

  • 若使用std::string,当实参为const char *时,会分配内存并拷贝该字符串以生成一个std::string

  • 当一个函数接受一个const std::string,而在该函数内部,又需要传递该值到另一个函数,则又需要重新生成一个std::string

目的

  • 当某个接口参数是接受字符串类型时,为了减少不必要的开销

  • 该类型可以接受const char *std::string,减少冗余代码编写

要点

  • StringPiece(google), StringRef(llvm), string_ref(boost),本质名,non-owning reference to a string

  • 通过隐式转换,方便地从const char*, std::string转换到此类型

  • 该类通过保存字符串指针和长度,来避免不必要的复制

  • 只支持非修改操作

  • 开销很低,只需要sizeof(const char*) + sizeof(size_t)字节

  • 支持所有的类容器操作

  • 因为StringPiece不拥有数据,所以确保在StringPiece生命期内,该数据可用

参考

  1. N3442: string_ref: a non-owning reference to a string.
  2. http://www.boost.org/doc/libs/1_60_0/libs/utility/doc/html/string_ref.html
  3. http://stackoverflow.com/questions/2172726/are-there-any-reasons-why-the-stringpiece-stringref-idiom-is-not-more-popular

留言