新闻详情

新闻详情

首页 / 资讯中心 / 详情

C++20 std::span:用一个参数传递连续内存,别忘了生命周期

发布时间:2026/9/27 1:55:39来源:尧图网络
C++20 std::span:用一个参数传递连续内存,别忘了生命周期
C20 std::span用一个参数传递连续内存别忘了生命周期传统接口常写成“指针加长度”。一旦长度传错调用方和被调用方就可能对数据范围产生不同理解。std::span 把地址和元素数量放在一个轻量视图里适合统一接收数组、std::array 与 vector。最低标准C20。span 是非拥有视图不负责分配或释放元素。1. 数组和 vector 使用同一个接口#includeiostream#includespan#includevectorlonglongsum(std::spanconstintvalues){longlongtotal0;for(intvalue:values)totalvalue;returntotal;}voiddouble_values(std::spanintvalues){for(intvalue:values)value*2;}intmain(){intarray[]{1,2,3};std::vectorintnumbers{4,5,6};std::coutsum(array)\n;double_values(numbers);std::coutsum(numbers)\n;std::spanconstintviewnumbers;std::coutsum(view.subspan(1,2))\n;}预期输出是 6、30、22。span 通常按值传递即可复制视图不等于复制底层所有元素。上面的 subspan 取出从下标 1 开始的两个元素同样没有复制数组内容。2. const 放在哪里很重要std::spanconst int表示不能通过该视图修改元素。const std::spanint则主要限制视图对象本身仍允许通过它修改 int 元素。设计只读接口时应选择前一种写法。span 只适用于连续存储。std::list 不是连续数组std::vector 也不能当成普通 bool 连续区间直接传入。3. 携带长度不等于自动防住所有越界C20 的 span 下标访问和 subspan 都有范围前提不应依赖它们自动抛出越界异常。上例之所以能取 subspan(1, 2)是因为长度确定为 3处理外部输入时要先验证范围。另一个关键问题是生命周期vector 扩容、容器销毁或原数组离开作用域后指向旧内存的 span 会失效。span 不会延长底层对象寿命也不会随着容器自动更新长度。即使 vector 增加元素但没有重新分配旧 span 也仍只覆盖原来的长度。4. 什么时候值得用算法只需要临时访问一段连续元素时span 很合适需要长期保存数据时应明确复制到拥有数据的容器。把 span 看成“带长度的借用”而不是“小型 vector”就不容易用错。接口与构造方式可进一步参考 Microsoft 的 span 文档。C20 std::span用一个参数传递连续内存别忘了生命周期传统接口常写成“指针加长度”。一旦长度传错调用方和被调用方就可能对数据范围产生不同理解。std::span 把地址和元素数量放在一个轻量视图里适合统一接收数组、std::array 与 vector。最低标准C20。span 是非拥有视图不负责分配或释放元素。1. 数组和 vector 使用同一个接口#includeiostream#includespan#includevectorlonglongsum(std::spanconstintvalues){longlongtotal0;for(intvalue:values)totalvalue;returntotal;}voiddouble_values(std::spanintvalues){for(intvalue:values)value*2;}intmain(){intarray[]{1,2,3};std::vectorintnumbers{4,5,6};std::coutsum(array)\n;double_values(numbers);std::coutsum(numbers)\n;std::spanconstintviewnumbers;std::coutsum(view.subspan(1,2))\n;}预期输出是 6、30、22。span 通常按值传递即可复制视图不等于复制底层所有元素。上面的 subspan 取出从下标 1 开始的两个元素同样没有复制数组内容。2. const 放在哪里很重要std::spanconst int表示不能通过该视图修改元素。const std::spanint则主要限制视图对象本身仍允许通过它修改 int 元素。设计只读接口时应选择前一种写法。span 只适用于连续存储。std::list 不是连续数组std::vectorbool也不能当成普通 bool 连续区间直接传入。3. 携带长度不等于自动防住所有越界C20 的 span 下标访问和 subspan 都有范围前提不应依赖它们自动抛出越界异常。上例之所以能取 subspan(1, 2)是因为长度确定为 3处理外部输入时要先验证范围。另一个关键问题是生命周期vector 扩容、容器销毁或原数组离开作用域后指向旧内存的 span 会失效。span 不会延长底层对象寿命也不会随着容器自动更新长度。即使 vector 增加元素但没有重新分配旧 span 也仍只覆盖原来的长度。4. 什么时候值得用算法只需要临时访问一段连续元素时span 很合适需要长期保存数据时应明确复制到拥有数据的容器。把 span 看成“带长度的借用”而不是“小型 vector”就不容易用错。接口与构造方式可进一步参考 Microsoft 的 span 文档。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

嵌入式硬件调试五法:串口打印、逻辑分析仪、JTAG/SWD等实战决策指南 2026/9/27 4:16:38

嵌入式硬件调试五法:串口打印、逻辑分析仪、JTAG/SWD等实战决策指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
SpringBoot+微信小程序图书管理系统实战:登录、借阅与部署全解析 2026/9/27 4:16:38

SpringBoot+微信小程序图书管理系统实战:登录、借阅与部署全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
网站代建设费用吗?5年实战避坑指南与源码解析 2026/9/27 4:16:38

网站代建设费用吗?5年实战避坑指南与源码解析

网站代建设费用吗?5年实战避坑指南与源码解析 别再被那些花里胡哨的模板网站忽悠了。很多老板花了几千块,拿回来一个套壳站,打开慢、样式丑,改个颜色还得求供应商,这钱花得冤不冤?我干了十年建站,见过太多这种“电子废品”。今天这篇 避坑指南…

阅读更多 →
Docker多阶段构建实战:让Nginx镜像从400MB瘦身到200MB,体积砍半! 2026/9/27 4:16:32

Docker多阶段构建实战:让Nginx镜像从400MB瘦身到200MB,体积砍半!

一、实验背景 在上一节实验中,我们基于 CentOS 7 构建了 YUM 版 Nginx 镜像,但镜像体积高达 400MB。这是因为 CentOS 7 基础镜像本身就包含大量系统工具和库,而容器运行 Nginx 实际上并不需要完整的操作系统环境。 多阶段构建(Mul…

阅读更多 →
搞懂怎么给网站做超链接,源码下载避坑指南 2026/9/27 4:16:31

搞懂怎么给网站做超链接,源码下载避坑指南

搞懂怎么给网站做超链接,源码下载避坑指南 备案流程一头雾水?很多新手刚拿到服务器,盯着后台那些ICP备案号、域名解析记录,脑子直接宕机。别慌,先别管备案那些繁琐的表格和审核周期,咱们先把手头最基础的活干完。如果你是从 源码下载…

阅读更多 →
AI生成PPT工具的功能观察:百度文库、Gamma、WPS AI 2026/9/27 4:16:31

AI生成PPT工具的功能观察:百度文库、Gamma、WPS AI

制作PPT时,排版、素材整理和格式调整通常比较耗时。AI一键生成PPT工具可以帮助提升效率。不同工具在内容生成、排版、中文场景、导出兼容性等方面各有侧重。以下从功能角度观察百度文库、Gamma、WPS AI三款工具。 一、百度文库 百度文库智能PPT支持输入主题、上传文…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉