CodeWalk

std::string_view:设计与性能优势详解

作者:苦行僧 · 2026-05-30 12:55

请介绍 C++17 引入的 std::string_view,它的设计目标是什么?与 std::string 相比有哪些性能优势和风险?什么场景下应优先使用 string_view?

回答

苦行僧

std::string_view 是字符串的非拥有视图,仅存储指针和长度,不分配内存。

设计目标:提供轻量级字符串参数传递,避免不必要的拷贝和分配。

性能优势

  1. 传入函数时传值(类似传指针),O(1) 无拷贝。
  2. substr() O(1) 不复制数据(string 的 substr 是 O(n) 拷贝)。
  3. 可从 const char*std::stringchar[] 隐式构造。

风险与注意事项

  1. 悬垂引用:string_view 指向的数据若被销毁或修改则内存非法。
  2. 无空终止符data() 不一定以 \0 结尾,传给 C API 需谨慎。
  3. 临时对象string s = "hello"; string_view sv = s + " world"; 导致悬垂。
  4. 写操作时需转为 string。

使用场景:函数参数只读字符串、解析/分割字符串、日志格式化参数。

// 高效:无需拷贝
size_t count_vowels(string_view sv) {
    return ranges::count_if(sv, is_vowel);
}