当前位置: 首页 > news >正文

一分钟讲透:c++新特性string_view

c++ weekly

#知识地图 #最佳实践 #CPP17

👋 各位老师好(老师是山东对人的一个尊称,就像称呼帅哥美女一样)

C++周刊 (c++ weekly)第一期 EP01 开始了

主题:

今天用一分钟讲清楚—面试官为什么爱问std::string_view。

这一期,我们将从零开始, 一步步带你理解string_view背后的设计初衷、使用边界,

以及它如何在项目中为我们节省内存、提升性能。

我们不讲枯燥的标准文档,不抛出脱离工程的例子。

相反,我们将聚焦在真实项目案例分析


1. 什么是string_view 与 string 有什么区别?

std::string_view` is a C++17 library type that provides a lightweight,non-owning reference to a sequence of characters

数据结构

代码语言:javascript

AI代码解释

Description

从定义看:和原来的 string 没有任何区别,都是一个指针 指向一个字符串?

C++17中我们可以使用std::string_view来获取一个字符串的视图 字符串视图并不真正的创建或者拷贝字符串

只有使用权力,没有所有权,不负责资源申请,释放。

算法操作:substr 零拷贝 零内存分配

图片

字符串切片(substr):不创建新对象,仅生成视图 ➜ 零拷贝

函数参数传递:无需构造临时字符串对象 ➜ 降低内存分配

std::string_view比std::string的性能要高很多

2. 使string_view 有啥好处

✅ 高频操作字符串,零拷贝 零内存分配 ,性能提高10%

✅开发者来说:修改一行代码,代码工作量不复杂,双手赞同

✅对领导来说:方案简单,收益大, 绝对同意

对比

string

string_view

收益

内存分配次数

O(n)

0

完全消除

内存拷贝量

路径总长度

0字节

零拷贝

解析延迟(1k QPS)

4.2μs/op

1.1μs/op

降低74%

CPU缓存命中率

83%

97%

+14%

3. 举例行业案例

使用场景

使用场景

OceanBase (OB)

自定义:ObString类 ,没有使用标准 std 库

代码语言:javascript

AI代码解释

class ObString { int32_t length_; char* ptr_; }; ObLogExternalStorageCtx::init(const ObString &uri)

RocksDB

自定义:RocksDB 有自己的Slice

代码语言:javascript

AI代码解释

class Slice { const char* data_; size_t size_; };

使用场景 WriteBatch 时候Slice类和std::string_view 转换

CephFS

使用 c++17 提供 string_view 代替string

场景 元数据 MDS 查找一个文件时候目录遍历

Tikv:

在 TiKV 这种对性能要求极高的 KV 存储中,大量的 key/value 是临时读取、比较、传递,而非修改;

TiKV 在访问 RocksDB 时,通过 Rust 封装的 FFI 接口(通过rocksdb::DB),对底层数据读取时不会创建新的字符串,而是传递指针和长度:

使用切片可以极大减少内存分配、数据复制、GC 压力;

切片比较

Rust

C++17

类型所有权

不拥有

不拥有

内存分配

拷贝行为

零拷贝

零拷贝

用法

slice 操作

substr操作

生命周期风险

编译期保障安全

存在悬垂引用风险

4. 动手挑战卡
4.1 系统设计

Ceph MDS 路径解析场景:输入:/mnt/data/project1/report.docx 输出:逐级路径 ["mnt", "data", "project1", "report.docx"] 🎯 考点内容:

STL 提供基本 API 是是否熟悉 find ,substr ,vector,string?

在日常工作用 有没有结果基础库代码?

优化string_view的路径分割组件 保证零内存分配、无拷贝?

最后一个report.docx 单词怎么出来的。

📎 面试小陷阱:

面试时候,面试官会问,你最近 5 年 是不是一直写代码,你回答自然是

面试官说好,他怎么知道你水平?经常会结合项目出一个系统设计题目

刷题 不光有算法题目 还有系统设计题目,

掌握数据结构,掌握算法,最后应用到实际项目才算通过

都是经常遇到小问题,一点都不难

4.2 传统实现(C++11)

代码语言:javascript

AI代码解释

// 存在多次内存拷贝 std::vector<std::string> split_path(const std::string& path) { std::vector<std::string> components; size_t start =, end =; while ((end = path.find('/', start)) != std::string::npos) { if (end != start) { components.push_back(path.substr(start, end - start)); } start = end +; } // 最后一个单词 if (start < path.length()) { // 再次拷贝 components.push_back(path.substr(start)); } return components; } // 调用示例 auto parts = split_path("/volumes/project_data/user/docs/report.docx");

问题

1

每个substr()调用触发堆分配(小字符串优化失效于>15字符)

2

解析长路径/a/b/c/d/e/f产生6次内存分配+拷贝

3

内存碎片加剧(尤其高频操作)

4.3 C++17实现

代码语言:javascript

AI代码解释

std::vector<std::string_view> split_path_sv(std::string_view path) { std::vector<std::string_view> components; size_t start =, end =; while ((end = path.find('/', start)) != std::string_view::npos) { if (end != start) { // 零拷贝:仅记录指针和长度 components.emplace_back(path.data() + start, end - start); } start = end +; } //最后一个单词 if (start < path.length()) { // 零拷贝 components.emplace_back(path.data() + start, path.length() - start); } return components; } https://www.cppreference.com/w/cpp/string/basic_string_view/find.html

小思考:C++ std::string::npos 表示什么无符号类型? 为什么不用-1 表示

图片

课后作业(可选)

http://www.cnnetsun.cn/news/1357600.html

相关文章:

  • Fish-Speech-1.5在网络安全教学中的语音辅助应用
  • Unity开发环境搭建全攻略:从安装到Hello World
  • KART-RERANK与软件测试结合:自动化生成测试用例的优先级排序
  • FreeRTOS命令行进阶:如何用CLI组件实现动态参数计算(含sum命令踩坑记录)
  • 从自行车模型到轨迹跟踪:纯追踪算法的核心推导与实践调优
  • 一篇文章掌握OBS多平台直播:obs-multi-rtmp插件终极指南
  • RT-detr训练避坑指南:如何安全绕过Image size限制与decompression bomb报错
  • [PYQT] VScode 集成 Qt Designer:从零构建带资源管理的桌面应用模板
  • 从数据到洞察:Python lifelines库Kaplan-Meier Fitter实战指南
  • Deepin系统SSH服务配置与Cpolar内网穿透实现高效远程办公
  • AI读脸术高可用部署:手把手教你实现服务自动恢复机制
  • 别再手动截图了!用Apache PDFBox 2.0.27 + Maven,5行Java代码搞定PDF批量转高清PNG
  • Android相机权限被禁用?手把手教你解决CAMERA_DISABLED (1)错误
  • Qwen1.5-1.8B-Chat-GPTQ-Int4实战手册:支持流式输出、历史上下文、角色设定
  • Python入门到实战:手把手教你调用DAMOYOLO-S完成目标检测
  • VASP6.4.2安装vtstcode-199避坑指南:为什么make顺序错了会失败?
  • lychee-rerank-mm环境配置:Ubuntu 22.04 + CUDA 12.1 + PyTorch 2.3适配清单
  • OpenClaw技能生态实战:用ollama-QwQ-32B自动生成周报并邮件发送
  • 快速构建Multisim 14.0安装引导原型:用快马AI十分钟打造可视化教程助手
  • WorkshopDL终极方案:跨平台游戏模组下载的高效实践
  • Llama Factory效果展示:微调前后对比,AI对话质量显著提升案例
  • 霜儿-汉服-造相Z-Turbo与Claude Code对比:不同AI模型在创意编程中的角色
  • 如何在OBS中为音频源添加VST插件:一个技术实现视角
  • Qwen3智能字幕对齐教程:清音刻墨错误对齐定位与人工修正快捷键大全
  • Linux下Matplotlib中文乱码终极解决方案:从字体安装到全局配置(附SimHei.ttf下载)
  • 美胸-年美-造相Z-Turbo:不止是快,实测主体一致性、细节丰富度大幅提升
  • R语言矩阵操作避坑指南:如何快速定位和解决‘subscript out of bounds‘错误
  • 基于SiameseAOE的Java面试题智能解析与观点抽取应用
  • Jupyter Notebook虚拟环境缺失?三步快速配置ipykernel的实战指南
  • 【目标跟踪】Anti-UAV数据集:多模态挑战与评估标准深度解析