一句话总结
std::string = 拥有内存、可修改、会拷贝std::string_view = 只看指针、不拥有、零拷贝、只读
1. 核心区别(最关键)
表格
| 特性 | std::string | std::string_view |
|---|---|---|
| 所有权 | 拥有字符串内存 | 不拥有,只是一个 “视图 / 窗口” |
| 拷贝成本 | 高(复制整个字符) | 0 成本(只复制指针 + 长度) |
| 可修改 | ✅ 可以修改 | ❌ 只读 |
| 内存管理 | 自动释放 | 不管内存 |
| 适用场景 | 存字符串、改字符串 | 函数传参、只读遍历、解析 |
2. 最简单理解
- string = 你买了一本书,可以写、可以撕、可以留着
- string_view = 你站在书架前看书,只能看,不能改,书不是你的
3. 代码对比
① std::string(会拷贝、慢)
cpp
运行
void print(std::string s) { // 这里会拷贝一份字符串!
cout << s << endl;
}
print("hello world"); // 产生临时对象 + 拷贝
② std::string_view(零拷贝、快)
cpp
运行
void print(std::string_view s) { // 无拷贝!仅指针+长度
cout << s << endl;
}
print("hello world"); // 超级快
string str = "test";
print(str); // 也超级快
4. 什么时候必须用 string_view?
只要你的函数【只读取、不修改】字符串,就用它!
适用场景:
- 日志打印
- 查找、匹配、解析
- 配置读取
- 作为函数入参
好处:✅ 速度极快✅ 不产生内存分配✅ 兼容 const char + std::string*
5. 什么时候不能用 string_view?
- 需要修改字符串
- 需要保存字符串(生命周期不确定)
- 需要c_str() 长期使用(string_view 不保证末尾 \0)
6. 最实用规则(背会就够)
👉 函数参数:优先用 std::string_view
cpp
运行
// 好
void func(std::string_view s);
// 一般(只有要修改时才用)
void func(std::string& s);
👉 存储变量:用 std::string
cpp
运行
std::string name = "zhangsan"; // 存起来
7. 相互转换
cpp
运行
string s = "abc";
string_view sv = s; // string → view(快)
string s2(sv); // view → string(会拷贝)
🎯 最终结论
- 只读、传参、解析 → string_view(更快、更好)
- 存储、修改、保存 → string(必须)


被折叠的 条评论
为什么被折叠?



