CodeWalk

C++17 string_view: 零拷贝字符串视图

作者:我是大山 · 2026-05-30 12:55

请说明C++17 std::string_view的设计原理(非拥有所有权的字符串引用)、相比std::string的优势(避免拷贝、子串操作O(1)),以及使用时需注意的生命周期和数据空终止问题。

回答

我是大山

std::string_view:对字符串序列的非拥有引用(const char* + length),不拷贝、不管理内存。

优势

  1. 零拷贝传参:函数参数用string_view替代const string&,避免从char*或子串拷贝string。
  2. 子串操作O(1)sv.substr(pos, n)返回新的string_view,无内存分配。
  3. 标准兼容:支持c_str()返回,兼容const char*和std::string。

典型用法

void parse(std::string_view sv) { /* 只读操作 */ }
parse("hello");     // 无拷贝
parse(some_string);  // 隐式转换

生命周期陷阱

  • string_view不拥有数据,若原字符串析构则sv悬空!
std::string_view get() {
  std::string s = "temporary";
  return s; // 危险!s析构后sv悬空
}
  • 不能保证空终止:sv.data()不一定以'\0'结尾,传给需C字符串的函数时需用std::string(sv).c_str()

vs const string&

  • string_view更轻量(指针+长度),但const string&可传临时对象的引用(生命周期延长),string_view则不会延长。