std::String_view是轻量级只读视图,不拥有数据,仅存指针和长度;不能直接当std::string用,因其无内存管理、不可修改、不保证空终止,且生命周期依赖底层数据。

std::string_view 是什么,为什么不能直接当 std::string 用
std::string_view 不是字符串容器,而是一个轻量级的、只读的“视图”——它只存两个成员:const char* 指针和 size_t 长度,不拥有数据,也不管理内存。这意味着它零拷贝、构造开销极小,但前提是它所指向的原始字符数据生命周期必须比 string_view 本身长。
常见误用:把局部 std::string 的 c_str() 或 data() 传给 string_view 并返回,导致悬垂指针:
std::string_view bad_example() { std::string s = "hello"; return std::string_view(s.data(), s.size()); // ❌ s 析构后 data() 失效 }
正确做法:确保底层存储长期有效(如字面量、静态变量、或由调用方保证生命周期的参数)。
如何安全地构造和传递 string_view 参数
函数参数用 std::string_view 替代 const std::string& 是 c++17 最实用的性能优化之一,尤其对高频调用接口(如解析、匹配、日志格式化)。它能同时接受字面量、std::string、C 风格数组,且无隐式转换开销。
立即学习“C++免费学习笔记(深入)”;
- 接受字面量:
"abc"→ 自动推导为std::string_view(编译期知道长度) - 接受
std::string s:func(s)→ 调用string_view(const char*, size_t)构造,不拷贝内容 - 接受 C 数组:
char buf[10] = "test"; func(buf)→ 注意数组必须以