std::string_view是C++17引入的轻量级字符串视图工具,通过不拥有数据、仅保存指针和长度的方式避免内存拷贝,提升性能;它可兼容C风格字符串、字面量和std::string等多种类型,减少函数重载,适用于只读场景如配置解析、日志记录等,但需注意不延长所引用数据的生命周期,防止悬空指针。

std::string_view 是 C++17 引入的一个轻量级工具,用于高效地引用字符串数据而无需复制。它的主要好处是避免不必要的内存分配和拷贝,提升程序性能,尤其是在处理大量字符串操作或频繁传参的场景中。
避免字符串拷贝,提升性能
传统使用 const std::string& 传递字符串时,虽然避免了所有权转移,但仍然可能隐式触发构造或转换开销。而 std::string_view 只保存指向原始字符数据的指针和长度,不拥有数据,构造几乎无开销。
例如:
void print_string(const std::string& s) { /* 可能触发临时 string 构造 */ }
void print_sv(std::string_view sv) { /* 零拷贝,直接视图 */ }
print_string("hello"); // 创建临时 std::string
print_sv("hello"); // 直接构造 string_view,无拷贝
统一接口,兼容多种字符串类型
std::string_view 可以无缝接受 C 风格字符串(const char*)、字面量、std::string 等多种类型,减少函数重载。
立即学习“C++免费学习笔记(深入)”;
说明与建议:
- 一个接受 std::string_view 的函数可以处理 "abc"、std::string{"def"}、char 数组等。
- 不需要为每种字符串类型写重载函数。
- 注意:不要用它返回局部字符数组的视图,生命周期问题会导致悬空指针。
作为只读参数的理想选择
当你只需要读取字符串内容,不做修改或长期持有,std::string_view 是比 const std::string& 更优的选择。
典型使用场景:
- 配置解析:传入键名查找,如 get_config(std::string_view key)
- 日志记录:记录消息而不复制内容
- 字符串前缀判断:sv.substr(0, 3) == "log"
基本上就这些。合理使用 std::string_view 能显著减少内存拷贝,提高运行效率,是现代 C++ 中处理字符串视图的推荐方式。关键是记住:它不管理生命周期,只做“看”,别“拿走”。










