0

0

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

下次还敢

下次还敢

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

|

485人浏览过

|

来源于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++免费学习笔记(深入)”;

示例:二维矩阵视图
#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";
    }
}

输出为:

Napkin AI
Napkin AI

Napkin AI 可以将您的文本转换为图表、流程图、信息图、思维导图视觉效果,以便快速有效地分享您的想法。

下载
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工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

505

2023.09.28

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

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

1135

2023.10.12

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

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

333

2023.11.22

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

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

784

2023.11.23

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

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

152

2023.11.27

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

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

194

2023.12.11

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

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

431

2023.12.12

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

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

163

2023.12.13

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

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

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