首页 > 后端开发 > C++ > 正文

c++的std::string_view是什么 零拷贝的字符串视图【性能优化】

穿越時空
发布: 2025-12-18 14:33:08
原创
107人浏览过
std::string_view是C++17引入的轻量只读字符串视图,仅持起始指针和长度,零拷贝、不拥有所指数据;适用于函数参数、切片等高频只读场景,但需确保底层内存生命周期长于view本身。

c++的std::string_view是什么 零拷贝的字符串视图【性能优化】

std::string_view 是 C++17 引入的一个轻量级、只读的字符串“视图”类型,它不拥有字符串数据,只是持有指向已有字符串内存的指针和长度——因此不分配内存、不复制字符,天然支持零拷贝。

为什么叫“视图”而不是“字符串”?

它本身不管理内存,也不存储字符数据,只记录两个信息:起始地址 + 长度。你可以把它理解成一个“窗口”,透过它看一段已存在的字符序列(比如 const char*、std::string、字面量等),但不能修改内容,也不能延长生命周期。

  • 构造开销极小:仅 2 个指针大小(通常 16 字节
  • 避免隐式转换和临时 std::string 构造(尤其在函数参数中)
  • 对字符串字面量(如 "hello")直接视图化,无任何运行时开销

典型用法:替代 const std::string& 参数

旧写法常把函数参数设为 const std::string&,看似避免拷贝,但调用时若传入 C 风格字符串或字面量,会隐式构造临时 std::string,产生堆分配和复制;而用 std::string_view 就能统一、高效地接收各种来源:

  • "abc" → 直接绑定,零成本
  • std::string s = "def"; f(s); → 取 s.data() 和 s.size(),无复制
  • const char* p = "xyz"; f(p); → 自动推导长度(遇 \0 停止),注意:若 p 不以 \0 结尾或含内嵌 \0,需显式指定长度

使用时要注意的坑

因为 string_view 不拥有数据,它依赖外部内存的有效性:

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 193
查看详情 Find JSON Path Online

立即学习C++免费学习笔记(深入)”;

  • 绝不能保存指向局部 std::string 或临时对象的 string_view(例如 return std::string_view(s);,s 出作用域后视图悬空)
  • 对 C 字符串构造时,默认按 \0 截断;若原始数据含 \0 或无结束符,应显式传入长度:std::string_view(p, len)
  • 不提供 .c_str() 方法(无权保证返回指针长期有效),需要时可手动取 .data()

适合哪些场景?

高频、只读、多来源的字符串处理是它的主场:

  • 函数参数(尤其是库接口、解析器、格式化函数)
  • 字符串切片(substr 返回仍是 string_view,仍零拷贝)
  • 编译期字符串处理(配合 constexpr,C++20 起更强大)
  • 避免日志、配置、路径拼接等场景中的冗余分配

以上就是c++++的std::string_view是什么 零拷贝的字符串视图【性能优化】的详细内容,更多请关注php中文网其它相关文章!

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号