0

0

C++中std::mdspan怎么用_C++23多维数组视图操作指南【现代】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-02-06 16:01:02

|

335人浏览过

|

来源于php中文网

原创

std::mdspan是C++23引入的轻量级多维数组视图,不拥有数据,仅持指针、布局和尺寸;构造需三要素(指针、extents、layout)且指针生命周期须覆盖mdspan;下标访问用operator()而非嵌套operator[];函数传参宜用模板推导;与拥有数据的std::mdarray定位不同;需编译器和标准库支持。

c++中std::mdspan怎么用_c++23多维数组视图操作指南【现代】

std::mdspan 是 C++23 引入的轻量级多维数组视图,它不拥有数据,只持有指向内存的指针 + 布局信息(layout)+ 尺寸(extents),类似 std::span 的多维扩展。它本身不分配内存,也不管理生命周期,用错最常见后果是悬空访问或越界读写——不是编译报错,而是运行时未定义行为。

怎么构造一个合法的 std::mdspan

构造核心是三要素:数据指针、尺寸描述(std::extents)、布局策略(std::layout_left/std::layout_right/std::layout_stride)。缺一不可,且指针必须保证在 mdspan 生命周期内有效。

常见错误:

  • 传入上局部数组地址,但 mdspan 逃逸出作用域 → 悬空
  • std::vector::data() 构造后,又对 vector 调用 push_backresize → 迭代器失效,指针失效
  • 尺寸参数顺序与实际内存布局不匹配(比如按行主序传了列数在前)→ 索引错位

正确示例(二维行主序):

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

int data[12] = {0};
std::extents ext; // 3 行 × 4 列
std::mdspan, std::layout_right> view{data, ext};
view(1, 2) = 42; // 等价于 data[1 * 4 + 2]

std::mdspan 的下标访问和 operator[] 差异

mdspan 支持多参数 operator()(如 view(i, j, k)),也支持单参数 operator[],但后者只对一维视图或降维后视图有意义。误用会导致编译失败或意外降维。

关键点:

Scrumball
Scrumball

AI驱动的网红营销平台

下载
  • view[i] 对二维 mdspan 返回的是 mdspan>(即“第 i 行”的切片视图),不是 T&
  • 要取元素必须用 view(i, j),不能写 view[i][j](除非你显式重载了嵌套 []标准库没提供)
  • view(i...) 参数个数必须严格等于秩(rank),少一个或多一个都编译不过

反例(编译错误):

std::mdspan> v{buf, std::extents{}};
auto row = v[0];        // OK:row 是 mdspan>
double x = v[0][1];     // ❌ error:row.operator[] 接受 size_t,返回 double&?不,它返回 mdspan<...>,而该类型无 operator[]

如何安全传递 std::mdspan 给函数

函数参数应优先使用模板形参推导,避免丢失秩和布局信息。直接写死类型(如 std::mdspan>)会失去泛化能力,且无法接受不同尺寸或布局的视图。

推荐方式:

  • 用模板参数约束 std::mdspan 类型:template void process(std::mdspan s)
  • 若只需读取,可加 conststd::mdspan,防止意外修改底层数据
  • 避免值传递大尺寸 mdspan(虽然它本身很小,但语义上易误导;引用更清晰)

注意:不能用 auto 参数(C++23 不支持),也不能用 std::mdspan —— 类型参数必须显式指定或由模板推导。

std::mdspanstd::mdarray 的关系别搞混

std::mdarray 是 C++23 同批引入的「拥有数据」的多维容器,内部用 std::mdspan 提供视图接口。二者定位完全不同:

  • mdspan 是视图(view)→ 零开销抽象,适合函数参数、算法接口、interop 场景(如对接 Fortran 数组或 GPU 内存)
  • mdarray 是容器(container)→ 自动管理堆内存,支持 resize,但目前不支持自定义分配器,也不支持非默认构造元素
  • 不要试图用 mdspan 替代 std::vector<:vector>> 来存不规则矩阵——它只支持规则(矩形)布局

真正容易被忽略的一点:当前主流标准库实现(libstdc++ 13+, libc++ 17+)才开始支持 mdspan,MSVC 2022 17.8+ 仅部分支持,且需开启 /std:c++23/experimental:module(某些版本)。头文件是 ,不是

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

581

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

104

2025.10.23

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

537

2023.09.20

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

178

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

107

2025.11.27

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1263

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

275

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2196

2025.12.29

1688阿里巴巴货源平台入口与批发采购指南
1688阿里巴巴货源平台入口与批发采购指南

本专题整理了1688阿里巴巴批发进货平台的最新入口地址与在线采购指南,帮助用户快速找到官方网站入口,了解如何进行批发采购、货源选择以及厂家直销等功能,提升采购效率与平台使用体验。

57

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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