讲师中心 微信公众号
AI工具推荐 视频效率加速

C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图

胖萱君_8041

胖萱君_8041

发布时间:2025-12-01 14:40:02

|

505人浏览过

|

来源于php中文网

原创

std::mdspan是C++23引入的多维数组视图,不拥有数据,仅提供对连续内存的多维索引访问,支持行优先、列优先等布局,适用于科学计算与图像处理,具有零开销抽象和高安全性。

c++的std::mdspan是什么_c++23中用于操作多维数组的非拥有视图

std::mdspan 是 C++23 引入的一个重要工具,用于表示多维数组的非拥有视图。它不管理数据的生命周期,只提供对已有内存块的多维索引访问方式,类似于 Python 中的 NumPy 切片或 Fortran 的数组视图。

什么是 std::mdspan

std::mdspan 指的是“multi-dimensional span”,即多维跨度。它允许你用多个下标(如 [i][j][k])来访问一段连续内存或自定义布局的数据,而无需复制原始数据。它常用于科学计算、图像处理、张量操作等需要高效多维访问的场景。

与 std::span 只支持一维不同,std::mdspan 支持任意维度(编译时或运行时指定),并且可以配合不同的布局策略使用。

关键特性:
  • 不拥有数据:只持有指向外部内存的指针
  • 支持静态和动态维度大小
  • 可定制内存布局(行优先、列优先、子矩阵等)
  • 轻量级、零开销抽象(在优化后基本不产生额外运行时成本)

如何使用 std::mdspan

创建一个 std::mdspan 需要三个要素:原始数据指针、各维度的大小、以及可选的布局策略。

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

Python Hardener
Python Hardener

通过完整的安全审查、代码整洁重构、健壮的错误处理、正确的日志记录以及完整的文档字符串覆盖,强化 Python 脚本。

下载
示例:二维矩阵视图
#include <mdspan>
#include <iostream>

int data[] = {1, 2, 3,
              4, 5, 6};

int main() {
    // 创建一个 2x3 的视图
    std::mdspan mat(data, 2, 3);

    for (int i = 0; i < 2; ++i) {
        for (int j = 0; j < 3; ++j) {
            std::cout << mat[i, j] << " ";  // 使用逗号运算符索引
        }
        std::cout << "\n";
    }
}

输出为:

1 2 3 
4 5 6

注意:索引使用 mat[i, j] 而不是 mat[i][j] —— 这是通过重载逗号运算符实现的 C++ 技巧。

支持的布局类型

std::mdspan 允许你指定数据在内存中的排列方式:

  • std::layout_left:列优先(类似 Fortran 或 MATLAB)
  • std::layout_right:行优先(类似 C/C++ 原生数组)
  • std::layout_stride:支持步幅的通用布局(可用于切片、转置等)
示例:使用列优先布局
std::mdspan col_mat(data, std::extents<int, 3, 2>{}, std::layout_left{});
// 现在 data[0] 对应 (0,0),data[1] 对应 (1,0),依此类推

应用场景与优势

std::mdspan 特别适合以下情况:

  • 封装 C 风格多维数组,提升安全性和可读性
  • 传递子区域给算法函数(如矩阵分块计算)
  • 对接 GPU 或加速器内存(配合 custom accessors)
  • 实现张量库、线性代数组件的基础构件

由于它是非拥有的,传参代价极小(通常是几个整数 + 一个指针),且能被编译器高度优化。

基本上就这些。std::mdspan 填补了 C++ 在多维视图方面的长期空白,让多维数据操作变得更安全、直观和高效。

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

相关专题

更多
fprintf在matlab中的用法
fprintf在matlab中的用法

fprintf是MATLAB中用于格式化输出的函数。fprintf的基本语法为“fprintf(fileID, format, A)”,其中,fileID是一个标识符,用于指定要写入的文件,如果要将数据写入到命令窗口中,则可以使用1作为fileID的值,format是一个字符串,用于指定输出的格式,A是要输出的数据。

758

2023.09.28

数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4843

2023.10.12

Matlab中length函数的用法
Matlab中length函数的用法

在Matlab中,length函数用于返回向量、数组或字符串中的元素个数。想了解更多length函数的相关内容,可以阅读本专题下面的文章。

518

2023.11.22

Matlab中axis函数用法
Matlab中axis函数用法

在Matlab中,axis函数用于控制坐标轴的范围和比例。想了解更多axis函数的相关内容,可以阅读本专题下面的文章。

912

2023.11.23

subplot在matlab中的用法
subplot在matlab中的用法

subplot在matlab中用于在同一个图窗中创建多个子图。通过指定子图的行数、列数和当前绘图位置,可以在每个子图中绘制不同的图形。想了解更多subplot在matlab中的用法,可以访问下面的文章。

237

2023.11.27

scilab和matlab的区别
scilab和matlab的区别

scilab和matlab的区别:1、注释符号;2、预设变量的表示;3、操作符的用法;4、矩阵的定义与调用;5、程序的编辑与执行;6、数据类型;7、函数库;8、图形界面;9、社区支持与生态系统;10、跨平台兼容性;11、价格。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

289

2023.12.11

Matlab如何四舍五入
Matlab如何四舍五入

Matlab可以通过round函数和格式化输出函数来对数值来进行四舍五入操作。更多关于Matlab相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1197

2023.12.12

Matlab中axis函数用法介绍
Matlab中axis函数用法介绍

在Matlab中,axis函数用于设置当前坐标轴的范围和刻度。想了解更多axis函数的相关内容,可以阅读本专题下面的文章。

283

2023.12.13

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn