std::string_view 是轻量字符串视图,不复制不管理内存,仅记录起始地址和长度;适用于只读、切分、比较场景,需严格保证底层数据生命周期长于其使用期。

用 std::string_view 就是拿一个轻量“窗口”去看已存在的字符串数据,不复制、不管理内存,只记录起始地址和长度——这是它高效的核心。
什么时候该用 string_view?
当你只是读取、切分、比较字符串,而不需要修改或拥有它时,优先考虑 string_view。比如函数参数接收字符串字面量、std::string、C 风格字符串等,统一用 string_view 可避免不必要的拷贝。
- 函数参数:代替
const std::string&或const char*,更通用且零开销 - 解析场景:HTTP 请求头、CSV 字段、命令行参数切分,只看不改
- 哈希/比较:做 key 查 map 或 set,避免构造临时
std::string
怎么创建和使用?
直接从字符串字面量、std::string、C 字符串构造即可,注意生命周期必须长于 string_view 的使用期。
-
std::string_view sv1 = "hello";(字面量,静态存储期,安全) -
std::string s = "world"; std::string_view sv2 = s;(引用 s 的数据,s 不能提前析构) -
std::string_view sv3(s.data(), 3);(手动指定指针+长度,适合子串视图) - 支持
substr()、find()、compare()、starts_with()(C++20)、ends_with()等常用操作,接口和std::string高度一致
要注意的坑
string_view 不拥有数据,所以它是个“危险的引用”——你得自己保证底层字符数组一直有效。
立即学习“C++免费学习笔记(深入)”;
- 别返回局部字符串的
string_view:auto bad() { std::string s = "hi"; return std::string_view(s); }——s析构后视图悬空 - 慎用 C 字符串构造:如果传入的是栈上临时
char buf[64],且string_view活得比 buf 久,就出问题 - 没有隐式转成
std::string:需要时显式调用std::string(sv),但这就失去零拷贝优势了
配合现代 C++ 更好用
C++20 起,string_view 支持字面量后缀 "hello"sv(需 #include ),写起来更简洁;同时 std::format、std::regex 等新设施也原生接受 string_view。
-
using namespace std::literals;启用"abc"sv语法 - 模板函数中用
string_view做参数,可接受所有字符串类型,真正实现“一次编写,多处适用” - 与
std::span类似思想,但专为字符串语义优化(如内置data()/size()和文本操作)
基本上就这些——不复杂但容易忽略生命周期。用对了,能省下不少内存分配和拷贝,尤其在高频字符串处理场景里效果明显。










